Sesos
Sesos is a language largely based upon brainfuck, but it has some extra features:
- Unbounded signed integers (can be disabled)
- I/O with numbers (input and output must be enabled separately)
- Conditional jump based on whether the input's EOF has been reached
- Conditional jump, with the code before it having been executed at least once.
Additionally, it has a difference from brainfuck: While brainfuck's +
and -
increment and decrement the current cell respectively, Sesos's add
and sub
take an argument determining how much to add or subtract respectively. The same difference also applies between brainfuck's >
(go one cell right) and <
(go one cell left) and Sesos's fwd
and rwd
.
Another important difference is that you can't put certain instructions next to each other, due to how the program is encoded into a binary file. More specifically, add
/sub
, fwd
/rwd
and jmp
/jnz
are pairs of instructions which can't be put one after the other. Also, get
can't go after add
or sub
.
The final difference is that jmp
and nop
can't be the last instructions of a program.
Programs are written top-to-bottom, instead of left-to-right, before compilation. There are 10 instructions and 3 assembler directives.
The instructions are:
add <n>
: Adds<n>
to the current cell.sub <n>
: Subtracts<n>
from the current cell.fwd <n>
: Moves<n>
cells forward.bwd <n>
: Moves<n>
cells backward.put
: Prints the content of the current cell.get
: Takes one input character (or integer) and replaces the current cell's content with it.jmp
: Sets an entry point, and jumps to its corresponding exit point (i.e. the closest following exit point that doesn't belong to any followingjmp
s).nop
: Sets an entry point.jnz
: Sets an exit point and, if the current cell is non-zero, jumps right below its corresponding entry point.jne
: Sets an exit point and, if STDIN's EOF hasn't been reached, callsget
and jumps right below its corresponding entry point.
Leading jmp
instructions can be omitted, as long as their corresponding exit points are explicitly present in the code. The same is true for trailing jnz
, where their corresponding entry points must be explicitly specified.
The assembler directives are:
set numin
: Take input as integers instead of characters.set numout
: Print as numbers instead of characters.set mask
: Use 8-bit unsigned integers instead of unbounded signed integers.
In the source code, those directives can be put anywhere, and the result will be the same.
Extra whitespace is ignored.
Details about the compilation process can be found over the GitHub repository.
I'm nominating this language because interest was always little and gradually faded away. I think it's a very interesting language, and it definitely has golfing potential.