A simple language for paper-computing.
Although the language is designed to be executed by a human, this repo provides an interpreter where programs can be run much faster than by hand.
l:[1 2 3 0] s:1 ; sum the values 1svl l> ln1 =s
cargo install --git https://firstname.lastname@example.org/~jummit/hase
The hase virtual machine is initialized with a set of registers, which have one-character long names.
They can be specified to be a set size like this:
; Register with five empty slots: r:5
Registers initialy have empty slots (value 0).
Registers can also be pre-filled with values:
; Register with the values 1, 2 and 3: r:[1 2 3]
Each register has a movable pointer which starts at the first slot.
; pointer on the first slot ; r:[ 2 3] r:[1 2 3] ; move right instruction r> ; pointer on the second slot ; r:[1  3]
Each line begins with a register name, followed by an instruction.
; move the pointer of register a one slot to the right a>
Most operations also require a value, which can be a number or the current value of a register:
; add one a+1 ; add the value a register is pointing to a+b
Move Right (>)
Move the pointer of a register to the right by the given amount.
When no parameter is given, the pointer is moved by one.
The cursor wraps around (the slots are arranged in a circle).
Move Left (<)
Same as move right, just backwards.
Move values from the second register to the first (empty the second, add it to the first).
Add the value to the register.
Subtract the value from the register.
Values can never be lower than zero.
Jump to the given label when the register is not empty.
Labels are defined by adding a number to a line:
5a+b; line labeled "5"
a+1 an1; jump to label one =0; was zero 1=1; was one
The jump instruction can be unconditional:
Stops the program and returns the result.
This instruction can be used in two different ways:
Returning a value:
Returning an entire register:
When the virtual machine runs out of instructions, every register is returned for inspection.