Reversible-2D

Reversible-2D is a 2D programming language which can be reversed. It is unique because it still has variables. The short for Reversible-2D is R2D. For version 1, it is R2D1. When version 2 comes, some ppl will lol. It is made by TehZ.

Commands
The current commands: \ and / Mirrors. P       Swaps the value of the current thread and the next cell in the source code. O       Outputs the value of the current thread. I       If the value to the right of this command is not space, throws an error. If it is space, this will read a byte from stdin and put it to the cell to the right. +       Adds 1 to the value of the current thread. -       Opposite of +. ¤       Ends the current thread. After a thread is terminated, it counts how many steps it has been terminated. N       Prints a newline character to stdout. Other   Nothing.

Commands are reversed by: \ and / Moving the other way through. P       Repeating the process. O       Removing last printed character from console/file. I       Taking the value of the cell to the right of the command and putting it into the threads value. +       Doing - instead. -       Doing + instead. ¤       Starting the thread and turning it around (after the amount of steps it has been terminated :D). N       Same as O.  Other    Nothing.

Commands are CaSe-SeNsItIvE!

Threads
A thread in R2D is not a normal thread, because all threads execute in the same process. They are placed in the source with the following commands: V    Down >    Right ^    Up  <     Left

A thread holds a 16 bit value (because java char's is 16 bit) which can be changed through the commands.

Priority's
Threads will execute in a fixed and well defined order: Y is first priority     The lower Y coordinate at start, the sooner a thread will run. X is second priority    The lower X coordinate at start, the sooner a thread will run.

Note on Threads
If a thread collides with a thread starting point in the same direction as the thread, there will come undefined behavior. If it was allowed, Reversible-2D would not be reversible.

Variables
There is two places that variables can be: Source     Each cell is a variable. Threads    Each thread is a variable.

Examples
Hello World: >PHOPeOPlOPlOPoOP,OP OPWOPoOPrOPlOPdOP!ON¤

The above program will write "Hello, World!" followed by a newline.

Cat (ignoring eof): / > \ \O I/

The above program will copy all input to output. *NOTE* It will actually produce undefined behavior, but it works in the standard interpreter.

Multithreaded: >PHOPeOPlOPlOPoOP,OP OPWOPoOPrOPlOPdOP!ON¤ >PHOPiOP!ON¤

The above program will write "HHeil!" followed by a newline, followed by "lo, World!" followed by a newline.

Turing Completeness
Reversible-2D is not Turing-Complete, because any program can either always terminate or always loop forever (but a forever loop gives undefined behavior).

Implementations
The official implementation.