OTOH
OTOH (standing for On The Other Hand and pronounced like "Hoth" without the "H") is a simple programming language designed to combine the technical advantages of assembly with the simplicity of a Turing machine. Suggestions, comments etc. are all welcome. (OTOH was created by User:Hiant, Fading Entity on 2010-09-04)
Language Overview
OTOH uses a Tape and a swap-space of two memory cells referred to as "hands" (16 bit RAM with 1 bit id's). "hand" values are initialized and default to 0. It has several very simple operators. These are:
~ The flip operator, it switches the current "hand" to the other(default "hand" is 0 at execution) > Increment memory pointer < Decrement memory pointer ^ Store contents of current memory cell in current "hand" (this zeros the memory cell) _ Store contents of current "hand" into current memory cell (this zeros the "hand") " Adds (current hand) to (other hand) stores the result in current hand (destructive) ' Same as +, but subtracts (other hand) from (current hand) : Same as +, but multiplies % Same as +, but current hand modulo other hand [ If current cell is >0, continue, else skip to matching "]" ] If current cell is 0, end loop, else skip to matching "[" ? Stores current "hand" id (0 or 1) to current memory cell , ASCII Input . ASCII Output ! Clone current hand into other (non-destructive) # Switch between ASCII and Numerical mode (initialized as ASCII)
Language Standards
- Cells may not wrap-around
- Cells may contain any number. (signed and unsigned)
- EOF must be 0
- The tape cannot wrap-around, but is considered infinite to the right
Computational Class
OTOH can easily be proven Turing complete through reduction from brainfuck.
Basic Structure
(Dec/Inc)rementing
Noticeably, OTOH lacks two very important BF commands, + and -. Instead, for the sake of obtuse-ification, creative use of the ? command is required. Both + and - can be simulated using this:
^?[_~^]~?^~@_
Where @ is either ' for - or " for +.
Not
The ? command can also function as a logical NOT.
^?[_~^]_~[~]?
And
The : command provides a numerical equivalent to AND.
Or
The " command provides a numerical equivalent to OR.
Hand Clear
Two multiplications (ex: (2,2):->(4,0):->(0,0))
::
Cell Clear
For current hand = 0
?
For currant hand = 1
~?
Examples
Hello World!
Hello World, but cheating using BF reduction for now.
^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^ [_~^?]~?^~"_^?[_~^?]~?^~"_[>^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^? [_~^?]~?^~"_>^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^? [_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_>^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_>^?[_~^?]~?^~"_<<<<^?[_~^?]~?^~'_]>^? [_~^?]~?^~"_^?[_~^?]~?^~"_.>^?[_~^?]~?^~"_.^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^? [_~^?]~?^~"_^?[_~^?]~?^~"_..^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_.>^?[_~^?]~?^~"_^?[_~^?]~?^~"_.<<^?[_~^?]~?^~"_^? [_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^? [_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_.>.^?[_~^?]~?^~"_^?[_~^?]~?^~"_^?[_~^?]~?^~"_.^? [_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_.^?[_~^?]~?^~'_^?[_~^?]~?^~'_^? [_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_^?[_~^?]~?^~'_.>^?[_~^?]~?^~"_.>.
After optimization:
~?^?~^~"?~^~"?~^~"?~^~"_>?~^~"?~^~"~<^~:_[>^?~^~"?~^~" ?~^~"?~^~"?~^~"?~^~"?~^~"_>^?~^~"?~^~"?~^~"?~^~"?~^~" ?~^~"?~^~"?~^~"?~^~"?~^~"_>^?~^~"?~^~"?~^~"_>^?~^~"_ <<<<^?~^~'_]>^?~^~"?~^~"_.>^?~^~"_.^?~^~"?~^~"?~^~"?~^ ~"?~^~"?~^~"?~^~"_..^?~^~"?~^~"?~^~"_.>^?~^~"?~^~"_.<<^ ?~^~"?~^~"?~^~"?~^~"?~^~"?~^~"?~^~"?~^~"?~^~"?~^~" ?~^~"?~^~"?~^~"?~^~"?~^~"_.>.^?~^~"?~^~"?~^~"_. ^?~^~'?~^~'?~^~'?~^~'?~^~'?~^~'_.^?~^~'?~^~'?~^~'?~^~'?~ ^~'?~^~'?~^~'?~^~'_.>^?~^~".>.
A reduction by a factor of 2!
Cat
Simple:
,[.,]
taC
Reverse Cat:
~>?[,^?~^~'?~^~'?~^~'?~^~'?~^~' ?~^~'?~^~'?~^~'?~^~'?~^~'_ [ ^?~^~"?~^~"?~^~"?~^~"?~^~" ?~^~"?~^~"?~^~"?~^~"?~^~"_ >, ^?~^~'?~^~'?~^~'?~^~'?~^~' ?~^~'?~^~'?~^~'?~^~'?~^~'_ ] ^?~^~"?~^~"?~^~"?~^~"?~^~" ?~^~"?~^~"?~^~"?~^~"?~^~"_ <[.<]>]
Not so simple.
External resources
Compiler
A to-ruby compiler exists. Download it from sprunge. (dead link)