RAND
RAND is an esoteric programming language created by User:Smallhacker, partially based on non-determinism. It's believed to be Turing complete, but this hasn't been proven.
Memory
RAND's memory consists of an unspecified amount of bytes (where "unspecified" should be interpreted as "as much as neccesary"). When the program starts, all memory locations are set to random values. The memory is accessed using variables.
The memory isn't global; every call to a subroutine backs up the real memory by pushing it onto the stack and sets all bytes in the real memory to random values. When the program leaves the subroutine, the backed up data is popped into the real memory.
There's only one completely global byte and one "one way" global byte: the variable "Com" which isn't affected by the stack pushing/popping (which allows it to be used as input/output for subroutines) and the variable "Arg" which is affected by the stack popping, but not pushing (meaning that it can be used to send data into the subroutine, but not back from it).
Commands
- RAND var - Sets 'var' to a random value
- AND var1 var2 - Sets 'var1' to 'var1' AND 'var2' (bitwise)
- OR var1 var2 - Sets 'var1' to 'var1' OR 'var2' (bitwise)
- ANDB var1 var2 - Same as AND, but only affects the lowest bit
- ORB var1 var2 - Same as OR, but only affects the lowest bit
- ROTR var1 - Shifts 'var1' to the right. The value wraps around (meaning that 1 becomes 128).
- LABEL name - A label used to jump around in the code
- IFEQ var1 var2 name - Jumps to label 'name' if 'var1' == 'var2'
- CALL name - Jumps to 'name' as a subroutine (pushing/clearing the memory)
- END - Leaves the subroutine (popping the memory) or exits the program if it's not in a subroutine.
C++-like comments (// and /* ... */) are allowed in the language.
Variables/Labels
Variable/label names can contain a-z, A-Z, 0-9 and underscore. Names don't have to start with a letter.
Unlike variables, labels are global.
Examples
Get0
Description: A subroutine that sets Com to 0
LABEL Get0 RAND Com LABEL Get0_Loop RAND Tmp IFEQ Com Tmp Get0_Loop AND Com Tmp ROTR Com AND Com Tmp ROTR Com AND Com Tmp ROTR Com AND Com Tmp ROTR Com AND Com Tmp ROTR Com AND Com Tmp ROTR Com AND Com Tmp ROTR Com AND Com Tmp END
Get1
Description: A subroutine that sets Com to 1
LABEL Get1 CALL Get0 LABEL Get1_Loop RAND Tmp IFEQ Com Tmp Get1_Loop ORB Com Tmp ROTR Tmp ORB Com Tmp ROTR Tmp ORB Com Tmp ROTR Tmp ORB Com Tmp ROTR Tmp ORB Com Tmp ROTR Tmp ORB Com Tmp ROTR Tmp ORB Com Tmp ROTR Tmp ORB Com Tmp END
Get2
Description: A subroutine that sets Com to 2
LABEL Get2 CALL Get1 ROTR ROTR ROTR ROTR ROTR ROTR ROTR END
Get4
Description: A subroutine that sets Com to 4
LABEL Get4 CALL Get1 ROTR ROTR ROTR ROTR ROTR ROTR END
Get8
Description: A subroutine that sets Com to 8
LABEL Get8 CALL Get1 ROTR ROTR ROTR ROTR ROTR END
...etc.