HEX

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;
== External resources ==
Interpreter
Specifications
Category:Languages
Category:Implemented
Category:2007
Category:Usability_unknown
Category:Finite state automata