HEX
Jump to navigation
Jump to search
HEX is a language created by User:Barrucadu based on the HEX machine from the Discworld books. As stated in the books, anything is possible if you get enough bugs in the system. If any discworld-enthusiasts want to help me with this, send me an email! The current specification is Hex Version 2.2
Commands
Command | Description |
---|---|
# | Comment |
Bug("name", "value") | Create a variable. |
Scuttle("bug") | Push bug to stack if not alread there, Pop it if it is. |
Write | Print the values of the bugs in the stack. |
Listen("bug") | Take 1 character of input and make it the value of <bug>. |
GBL | Pull the Great Big Lever (start the program). |
Return | Pop all bugs from the stack. |
Fork("bug1" operator "bug2") | If bug1 (operator) bug2, where operator is ==, !=, >=, <=, >, <. If using anything other than "==" or "!=", bug must be numeric. Next line will be treated as a comment if false. |
EndFork | End the current FORK. |
SetTrack ("bug") | Set the track to "bug". |
Track ("track") | If the track is equal to "track", execute the following code (Up to the relevant EndTrack). |
EndTrack | End the current TRACK. |
Breed("bug1" operator "bug2") | Perform an action on bug1, using the operator and bug2 as an argument. Operator can be +, -, /, * or =. Bug1 contains the value and Bug2 is unchanged. Bugs must be numeric for -, / and *. If using + with non-numeric bugs, the values will be concacted together. |
:name | Defines a label |
Goto name | Jumps to a label. The label can be anywhere in the code. |
End | Terminates the program. It is not needed to make the code valid. |
Chr("bug") | Convert the bugs value to an ASCII character. Bug must be numeric. |
Asc("bug") | Convert the bug to its ASCII numeric value. Bug must be one character long. |
Quine | Print the programs source, after it has finished executing. |
Error Messages
Error Message | Meaning |
---|---|
"+++ Out of Cheese Error. Redo From Start. +++" | Bug or label does not exist. |
"+++ Melon melon melon +++" | Tried to perform an action with invalid parameters. |
"+++ Divide By Cucumber Error. Please Reinstall Universe And Reboot +++" | Unknown command. Anything other than a comment or whitespace before the GBL is considered an unknown command. |
Notes
- Semicolons are interpreted as command terminators.
- Whitespace is ignored.
- The interpreter stops reading a line after it gets to a valid command, so "GBLhuyt" would still be valid, as it reaches "GBL" before "huyt".
- Strings cannot contain ", ' or ;. Escape these characters.
- The interpreter has been broken from one big function into several smaller ones.
- There is a syntax change in FORK and BREED. Look at the commands to find the new syntax.
Examples
Basic Hello World
GBL; Bug("1", "Hello, World!"); Scuttle("1"); Write;
CAT Program
GBL; Bug("1", ""); Bug("2", ""); Bug("3", ""); :CAT_Loop Listen("2"); Fork("2" == "3"); Scuttle("1"); Write; End; EndFork; Breed("1" + "2"); Goto CAT_Loop;
Most Simple Quine Possible
GBL; Quine;
99 Bottles of Winkles Old Peculiar
GBL; Bug("1", "99"); Bug("2", "0"); Bug("3", "0.5"); Bug("4", "There are "); Bug("5", " bottles of Winkles Old Peculiar, sitting on a wall."); Bug("6", " bottles of Winkles Old Peculiar."); Bug("7", "Take one down, pass it to Vimes,"); :Loop Bug("Line_1", ""); Breed("Line_1" + "4"); Breed("Line_1" + "1"); Breed("Line_1" + "5"); Bug("Line_2", ""); Breed("Line_2" + "1"); Breed("Line_2" + "6"); Bug("Line_3", ""); Breed("Line_3" + "7"); Scuttle("Line_1"); Write; Return; Scuttle("Line_2"); Write; Return; Scuttle("Line_3"); Write; Return; # This statement is executed twice for some reason, thats why Bug 3 is set to 0.5, instead of 1. # If you can find the problem, and tell me, i'll be happy. Breed("1" - "3"); Fork("1" < "2"): End; EndFork; Goto Loop;