&brainfuck
&brainfuck (pronounced "reference brainfuck") is a brainfuck variant discovered by User:Orby in May of 2020.
Model
&brainfuck uses a right-unbounded tape of unbounded non-negative cells. Decrementing a data pointer that is zero, decrementing a cell that is zero, and decrementing an indirection level that is zero all produce undefined behavior.
Commands
| Command | Action | 
|---|---|
| > | Increment the data pointer | 
| < | Decrement the data pointer | 
| * | Increment the level of indirection | 
| & | Decrement the level of indirection | 
| [ | If the cell pointed to by the data pointer is zero, jump after matching ] | 
| ] | If the cell pointed to by the data pointer is non-zero, jump after matching [ | 
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". When the level of indirection is two, > becomes "Increment the cell pointed to by the cell pointed to by the data pointer", and so on. Therefore, + can be represented as *>& and - can be represented as *<&. Notice that [ and ] inherently contain one level of indirection, but their level of indirection is also increased with * and decreased with &.
Reversible variant
A reversible variant of &brainfuck can be achieved by altering the loop construct.
| Command | Action | 
|---|---|
| [ | If the cell pointed to by the data pointer is zero, jump after matching ] | 
| ] | If the cell pointed to by the data pointer is zero, jump after matching [ | 
To compute the inverse of a program, simply reverse the program string and replace characters according to the following table
| Command | Inverse | 
|---|---|
| > | < | 
| < | > | 
| * | & | 
| & | * | 
| [ | ] | 
| ] | [ | 
Converting from brainfuck
Brainfuck programs can trivially be converted to &brainfuck programs, but the converse is not true.
| bf | &bf | 
|---|---|
| > | > | 
| < | < | 
| + | *>& | 
| - | *<& | 
| [ | [ | 
| ] | ] | 
See also
- *brainfuck
- brainfuck
- Befinde
- Symbolic Brainfuck
- Git for reference implementation in C.
- Git branch for Rust implementation with absolute addressing