Art3d

From Esolang
Jump to navigation Jump to search

Made with <3 by Gabriel Clark

Description:

The language described here is a 3D Esolang, similar to ARGH. Its execution space is a 3D grid where instructions are executed based on the current direction of the instruction pointer and its location within the grid. This language interacts with a stack, and the grid can be thought of as both the program and memory.

Basic Concepts:

1. **State (3D grid)**: The execution space.

2. **Instruction Pointer (IP)**: Points to the current cell in the state that is being executed. The IP moves in a specific direction.

3. **Instruction Direction**: Defines the direction in which the IP should move after executing an instruction.

4. **Stack**: A Last-In-First-Out (LIFO) data structure used to store and manipulate values.

Commands:

Data Manipulation:

1. **`A`**: Add the value of the cell above the current cell to the value on top of the stack.

2. **`a`**: Add the value of the cell below the current cell to the value on top of the stack.

3. **`D`**: Delete (pop) the top value off the stack.

4. **`d`**: Duplicate the top value on the stack.

5. **`F`**: Fetch (pop) the value from the top of the stack and store it in the cell above.

6. **`f`**: Fetch (pop) the value from the top of the stack and store it in the cell below.

7. **`G`**: Get one byte from stdin and store in the cell above the IP.

8. **`g`**: Get one byte from stdin and store in the cell below the IP.

9. **`R`**: Reduce the value on top of the stack by the value of the cell above.

10. **`r`**: Reduce the value on top of the stack by the value of the cell below.

11. **`S`**: Store (push) the value of the cell above the current cell onto the stack.

12. **`s`**: Store (push) the value of the cell below the current cell onto the stack.

Output:

1. **`P`**: Send the value in the cell above the current cell to stdout.

2. **`p`**: Send the value in the cell below the current cell to stdout.

Control Flow:

1. **`H`**: Jump (move IP) left to the next cell whose value matches the value on top of the stack and set the execution direction to left.

2. **`h`**: Set the execution direction to left.

3. **`J`**: Jump down to the next cell whose value matches the value on top of the stack and set the execution direction to down.

4. **`j`**: Set the execution direction to down.

5. **`K`**: Jump up to the next cell whose value matches the value on top of the stack and set the execution direction to up.

6. **`k`**: Set the execution direction to up.

7. **`L`**: Jump right to the next cell whose value matches the value on top of the stack and set the execution direction to right.

8. **`l`**: Set the execution direction to right.

9. **`W`**: Jump in the positive z-direction to the next cell whose value matches the value on top of the stack and set the execution direction to positive z.

10. **`w`**: Set the execution direction to positive z.

11. **`E`**: Jump in the negative z-direction to the next cell whose value matches the value on top of the stack and set the execution direction to negative z.

12. **`e`**: Set the execution direction to negative z.

13. **`X`**: If the value on top of the stack is negative, turn the execution direction 90 degrees to the left.

14. **`x`**: If the value on top of the stack is positive, turn the execution direction 90 degrees to the right.

15. **`q`**: Quit/end program execution.

Special:

1. **`#`**: Behaves like `j` but only if its position in the code/data array is (0,0) and only if there's a `!` in the cell on its right side.

.3D file format

Program Structure for the 3D Language:

1. **Initialization:**

``` Size() <dimensions> ```

This specifies the size of the grid. In the provided example, it's `4,4,4`.

2. **Program Body:** The program body consists of a series of layers (in this example, four layers). Each layer consists of rows and each row consists of cells, similar to a 3D matrix or tensor.

- Each cell contains either a command, a number, or a space (interpreted as a null operation).

- Commands are executed based on the current cell's position and contents.

3. **Delimiter:**

----- This separates each layer. It’s essential for distinguishing between the layers of the 3D matrix.

Guidelines:

1. **Dimension Declaration:** Start the program with the `Size()` function, followed by the grid's dimensions.

2. **Layered Structure:** Always ensure the program is structured in layers, separated by the delimiter `-----`.

3. **Consistent Dimensions:** Ensure that the number of rows and cells in each row is consistent with the declared dimensions.

4. **Commands and Numbers:** Use commands and numbers within cells to carry out operations. The exact semantics of each command would need further clarification.

5. **Whitespace:** Utilize spaces for null operations or placeholders. This helps maintain the grid's shape when not all cells in a row have operations.

6. **End of File:** The program concludes when all layers are defined, and no additional delimiters are required after the last layer.

Example Program

A simple accumulator looks as follows

 Size()
 4,4,4
 sdre,
 1 0j,
   j,
 llle,
 -----
 e,
   f,
    ,
 w  A,
 -----
 j,
   w,
    ,
 w  d,
 -----
 jhhh,
 jlpk,
 jk,
 wkFh,
 -----