RHOVL
| Paradigm(s) | Imperative |
|---|---|
| Designed by | User:Sλλλ1(210) |
| Appeared in | 2021 |
| Computational class | Turing complete |
| Reference implementation | Github |
| File extension(s) | .txt |
RHOVL (Register, Heap, One Variable Language) is an esolang created by Andrew Phillips in 2021. RHOVL is a simplistic imperative language that utilizes 26 variable registers a-z for data storage, a heap for function storage, and a single variable position for manipulating data. All data in RHOVL is u8, although the python implementation does not abide by this.
Specification
In the table below, the characters a, b, c are used to represent values that may only be registers (that is, a literal letter), while x, y, z are used to represent values that may be registers or constant literals (such as 3).
| Code | Explanation |
|---|---|
3 |
set the variable to a constant |
a |
set the variable from a register |
= a |
put the variable value into a register |
+ x |
modify the variable by an operation |
< x |
set the variable to 1 or 0 depending on a comparison |
+= a |
modify a register by the variable value |
# |
get an ASCII-decoded value from stdin and put it in the variable |
$ |
print the variable as ASCII to stdout, or as a number with various format options |
(EXPR1:EXPR2) |
"if EXPR1 then EXPR2;" perform EXPR1, then perform EXPR2 if the variable is nonzero. |
(EXPR1;EXPR2) |
"while EXPR1 do EXPR2;" |
(EXPR) |
do EXPR, then restore the variable to the value it had before EXPR. |
[xyz: EXPR] |
do EXPR for each of the constant/register values before the colon |
[abc; EXPR] |
do EXPR for each of the register values before the colon, then store each result back in the same register |
[xyz: EXPR :abc] |
do EXPR for each of the constant/register values before the colon, then store each result back in the corresponding register behind the second colon |
["hello":$] |
a (possibly escaped) "string" compiles into a list of ASCII constants that can be iterated over |
{ EXPR } |
put a new function on the heap, and store the pointer to it in the variable |
@x |
run the function pointed to by the register/constant x |
Operations
RHOVL implements the standard operations + - * / %, as well as ^ for exponentiation.
A register-modifying expression such as -=r places the register on the LHS of the operation, which means it is different from (-r=r) so long as the operation is noncommutative. Neither or these expression change the value of the pass-through variable.
Additionally, RHOVL implements the bitwise operators & (and) | (or) ~ (xor). These may also be used with the register-modifying syntax above.
RHOVL also implements the logical comparison operators < > <= >= == != , but these cannot be utilized with the register-modifying syntax.
Output formatting
When outputting with $, the number is usually treated as an ASCII code. This behavior can be modified by suffixing the $ operator:
$'as a number without an ending$`as a number followed by a newline$_as a number followed by a space$,as a number followed by a comma and a space
When taking input with #, there are three variants:
#takes the next character input as ASCII#_takes the next non-whitespace character input as ASCII (consuming skipped input as well)#'matches the input with/\s*(\d+)/for numeric input
Examples
Hello world
["hello world":$]
Cat
(#;$)
Note that when eof is reached, # puts 0 into the variable, ending the loop
Truth machine
#'($';)
For and while loops
list and loops tests while loop and fancy list printing 10 (; $,-1) for loop and string printing ["Blast Off!":$] 10$ prints newline use for-put to move & modify data ["the first four squares are: ":$] [1 2 3 4::abcd] initialize list [abcd:^2:efgh] map list and store somewhere else [efgh:$_] 10$ build a list with for-modify 3 = x [abcdefg; x+2=x] ["built list: ":$][abcdefg:$_] 10$ [abc;-3] alter the first three items ["built list: ":$][abcdefg:$_] 10$ sum a list with for 0 = x [abcdefg: +x=x] ["sum of the list is ":$] x$' 10$
Note that writing in files simply causes registers to be loaded uselessly, so it can be used as a (perhaps costly) comment.
Function with branching
if and function tests
{= y
(x > y: x$'[" is greater than ":$]y$')
(x < y: x$'[" is less than ":$]y$')
(x== y: x$'[" is equal to ":$]y$')
10$ (a newline)
} = f
3 = x
[1 2 3 4 5: @f]
Factorial
{(1=j)(;*=j-1)j} = factorial
[1 2 3 4 5:
(["factorial of ":$])
$' ([" is ":$])
@f $`
]
Interpreter
The creator of the language has put a python interpreter and several examples on GitHub