BrainCube
BrainCube is an esoteric programming language inspired by brainfuck, that uses a 3D memory cube instead of brainfuck's memory tape. In addition to the memory cube, BrainCube also adds user-declared pointers, and control flow structures.
Syntax
Pointers
To declare a new pointer, write the pointer's name, surrounded by white space. Example: ~my_ptr~
To execute commands using a pointer, write the pointer's name followed by a sequence of pointer commands in parentheses. Example: my_ptr(+>)
Pointer commands
| Command | Description |
|---|---|
> |
Move pointer to the right |
< |
Move pointer to the left |
^ |
Move pointer up |
v |
Move pointer down |
X |
Move pointer forward (into the cube) |
O |
Move pointer backward (out of the cube) |
+ |
Increment the target cell |
- |
Decrement the target cell |
. |
Write the value of the target cell to the console as an ASCII character |
' |
Write the value of the target cell to the console as a binary number, followed by a newline |
: |
Write the value of the target cell to the console as a base10 number, followed by a newline |
, |
Set the value of the target cell to the ASCII value of a character from the console |
" |
Set the value of the target cell to the value of a binary number from the console (User types binary number, then hits enter) |
; |
Set the value of the target cell to the value of a base10 number from the console (User types base10 number, then hits enter) |
Control flow
If statements will execute if the target of the given pointer is a non-zero value. Syntax:
(pointer_name){More BrainCube code}
While statements will repeatedly execute while the target of the given pointer has a non-zero value. Syntax:
(pointer_name)[More BrainCube code]
Repeat statements will execute n times, with n being the initial value of the pointer's target cell, or a number literal written in place of the given pointer. Syntax:
(pointer_name OR number_literal)(More BrainCube code)
System commands
| Command | Description |
|---|---|
! |
Stops program execution |
? |
Triggers a garbage collection |
# |
Debugging breakpoint (Exact behavior depends upon implementation) |
Example programs
Hello, World!
/** Initialization **/
~ch~
ch(XXXXXXX) /*Move to [7][0][0]. The first 256 cells of the tape at [7][0] will hold ASCII values.*/
/** Set cells [7][0][0]..[7][0][255] to 0..255 **/
ch(>+) /*Set [7][0][1] to 1*/
(ch)[
(ch)(
ch(>+<) /*Increase the cell to the left of the current cell by one.*/
) /*The result of this repeat loop is setting the cell to the left of ch to the value of ch*/
ch(>+) /*Move ch to the left, and increment that cell's value, setting the value of [7][0][n] to n*/
] /*This loop exits after the value of ch overflows back to zero.*/
ch(<)
(ch)[ch(<)] /*Go back to [7][0][0]*/
/** Print "Hello, World!" followed by null terminator and newline **/
/*
Each line moves ch to [7][0][the number in the parentheses],
prints the value as a character,
and moves back to [7][0][0]
*/
(072)(ch(>))ch(.)(ch)[ch(<)] /* H */
(101)(ch(>))ch(.)(ch)[ch(<)] /* e */
(108)(ch(>))ch(.)(ch)[ch(<)] /* l */
(108)(ch(>))ch(.)(ch)[ch(<)] /* l */
(111)(ch(>))ch(.)(ch)[ch(<)] /* o */
(044)(ch(>))ch(.)(ch)[ch(<)] /* , */
(032)(ch(>))ch(.)(ch)[ch(<)] /* */
(087)(ch(>))ch(.)(ch)[ch(<)] /* W */
(111)(ch(>))ch(.)(ch)[ch(<)] /* o */
(114)(ch(>))ch(.)(ch)[ch(<)] /* r */
(108)(ch(>))ch(.)(ch)[ch(<)] /* l */
(100)(ch(>))ch(.)(ch)[ch(<)] /* d */
(033)(ch(>))ch(.)(ch)[ch(<)] /* ! */
(000)(ch(>))ch(.)(ch)[ch(<)] /* \0 */
(010)(ch(>))ch(.)(ch)[ch(<)] /* \n */