|Computational class||Turing complete|
|Reference implementation||Rust implementation|
Befinde is a variation of &brainfuck with relative addressing and fixed-sized cells, which makes writing compilers and interpreters easier, but writing programs maybe harder.
Befinde uses a right-unbounded tape of at least 9bit signed integer cells. Trying to use a negative address and decrementing an indirection level that is zero all produce undefined behavior and will probably or deterministically crash the interpreter. The data pointer is mapped to cell 0.
|>||Increment the data pointer|
|<||Decrement the data pointer|
|*||Increment the level of indirection|
|&||Decrement the level of indirection|
|[||If the data pointer is zero, jump after matching ]|
|]||If the data pointer is non-zero, jump after matching [|
|(||Like [, but uses the level of indirection as loop condition|
|)||Like ], but uses the level of indirection as loop condition|
|.||Print the value (data pointer & 0xff) as a byte|
|,||Read a byte from stdin, and set the data pointer to it.|
The level of indirection begins at zero. At this point all commands behave normally. When the level of indirection is one, > becomes "Increment the cell pointed to by the (data pointer + 0)". When the level of indirection is two, > becomes "Increment the cell pointed to by the cell pointed to by the (data pointer + 0)", and so on. Therefore, + can be represented as *>& and - can be represented as *<&.
Brainfuck programs can be transformed to Befinde according to the following table:
Alternatively, the BF code can be wrapped in *code& and the following table could be used:
[<] get to next zero cell *[<]& set current cell to 0 *[&>*] point to zero and increase indirection with 1 [*>&<] increment all cells until we find the pointer (the pointer must be positive) [*<&>] increment all cells until we find the pointer (the pointer must be negative)