ONE WAY
- The title of this article is not correct because of technical limitations. The correct title is actually .
is an esoteric programming language created by User:DigitalDetective47 based on one‐way movement of data across stacks. The name of this language should be represented as the image used in this article at a size such that the text on the image matches the size of the surrounding text. (For reference, the total height of the image should be approximately three times the height of the text. However, the choice of font can affect what scaling factor is appropriate.) If an image cannot be used (such as in applications that do not allow images to be inlined with text), the name should be written in all caps. If given the choice between a line‐breaking image and text, text should be preferred to maintain proper textflow.
Error vs. exception
In this article, an error refers to a problem with the program's formatting and/or structure, and will prevent the program from running, whereas an exception refers to an issue that occurs during the program's execution, and will not prevent the program from starting.
Data
Data can be stored in two stacks, the primary stack and the secondary stack. Data can be moved from the primary stack to the secondary stack, but not from the secondary stack to the primary stack. Stack operations affect the primary stack by default.
Data types
bool
Either true or false. A bool
is specified as true
or false
.
num
A rational number with an unbounded numerator and denominator. A num
can be specified as an integer (ex. 10
), a fraction (ex. 9/7
) or as a decimal (ex. 0.1
). When a decimal is parsed, its exact value is stored.
str
A sequence of Unicode characters. A str
is specified by an expression starting with a quotation mark. The str
extends to the end of the line. A newline within a string can be specified by the escape sequence \n
, and a literal backslash can be represented as \\
. Any other backslash sequence will cause an error.
type
The type of a value. Is specified as bool
, num
, str
, or type
.
Commands
There are two main types of commands: inline commands and block commands. Inline commands are on a single line, whereas block statements may be followed by a block of commands indented by two spaces. A command that receives a value of an unexpected type will cause an exception, as will a command that attempts to pop from an empty stack. Empty lines are ignored, and a line that is neither empty nor a valid command will cause an error.
Command | Effect |
---|---|
add |
POP num→a; POP num→b; PUSH a + b;
|
and |
POP bool→a; POP bool→b; PUSH a ∧ b;
|
chr |
Pop a num and push a 1‐charactetr str with the Unicode character corresponding to the num . Cause an exception if the value is <0, >1114111, or not an integer.
|
concat |
POP str→a; POP str→b; PUSH a + b;
|
divide |
POP num→a; POP num→b; PUSH a ÷ b; Cause an exception if b = 0 .
|
drop |
Remove the top value of the stack. |
dupe |
Duplicate the top value of the stack. |
equal |
Pop two values and push whether they are equal. Two values of different types are never equal. |
eval |
Pop a str and push the literal that it contains. Cause an exception if the str is not a valid literal.
|
flip |
Pop an element from the primary stack and push it to the secondary stack. Causes an error if used in a second block.
|
greater |
POP num→a; POP num→b; PUSH a > b;
|
input |
Read a line of input and push it as a str .
|
len |
Pop a str and push its length.
|
less |
POP num→a; POP num→b; PUSH a < b;
|
multiply |
POP num→a; POP num→b; PUSH a × b;
|
not |
POP bool→a; PUSH ¬a;
|
or |
POP bool→a; POP bool→b; PUSH a ∨ b;
|
ord |
Pop a str of length 1 and push the Unicode value of its character as a num . Cause an exception if the str does not have exactly 1 character.
|
print |
Pop a str and print it to the terminal.
|
push <value> |
Push the given literal. Cause an error if the proceeding value is not a valid literal. |
random |
Pop num s , and push for a random integer such that . Cause an exception if .
|
repr |
Pop a value and return a string containing a literal representation of the value popped. A num is an integer (if the num represents an integer), otherwise it is a fraction in simplest form.
|
split |
Pop a str and push its characters in order, with the first character on the top.
|
subtract |
POP num→a; POP num→b; PUSH a − b;
|
typeof |
Pop a value and push its type. |
Command | Effect |
---|---|
if |
Pop a bool . If it is true , run this statement's block.
|
else |
Auxiliary to the if block, runs if the popped value was false .
|
second |
All stack access within this block uses the secondary stack instead of the primary stack. Causes an error if nested. |
while |
Pop a bool . If it is true , run this statement's block and then run this block again. If it is false , jump past this block. Note that while pops on each iteration.
|
Examples
Mandatory test cases
push 0.1 push 0.2 add push 0.3 equal repr print
should output
true
push "Hello, world!" print
should output
Hello, world!"
push 3 push 1 divide repr print
should output
1/3
Hello, world!
push "Hello, world! print
Infinite loop
push true while push true
Truth-machine
input push "0 equal if push "0 print else push true while push "1 print push true
Binary to unary conversion
push 1 input dupe flip second split len subtract dupe push 0 equal not while dupe second eval dupe push 0 equal not while push -1 add second push 2 multiply dupe push 0 equal not drop push -1 add second dupe push 0 equal not while push "* print push -1 add dupe push 0 equal not drop dupe push 0 equal not
Cat program
input print
Reverse cat
push type second push type input split dupe push type equal not while flip dupe push type equal not second dupe push type equal not while print dupe push type equal not
99 bottles of beer
push 99 dupe push 2 equal not while dupe repr dupe print push " bottles of beer on the wall,\n print print push " bottles of beer.\nTake one down, pass it around,\n print push -1 add dupe repr print push " bottles of beer on the wall.\n\n print dupe push 2 equal not push "2 bottles of beer on the wall,\n2 bottles of beer.\nTake one down, pass it around,\n1 bottle of beer on the wall.\n\n1 bottle of beer on the wall,\n1 bottle of beer.\nTake one down, pass it around,\nNo bottles of beer on the wall.\n\nNo bottles of beer on the wall,\nNo bottles of beer.\nGo to the store, buy some more,\n99 bottles of beer on the wall. print
Deadfish
This implementation supports multiple commands per line, and suppports the h
command, which also exits the shell.
second push 0 push true push type push true while push ">> print input split dupe push type equal not while dupe push "h equal if drop push true while push type equal not push false else dupe push "d equal if second dupe push 0 equal not if dupe push 257 equal if drop push 0 else push -1 add else dupe push "i equal if second dupe push 255 equal if drop push 0 else push 1 add else dupe push "o equal if second dupe repr print push "\n print else second dupe push 16 equal if drop push 0 else dupe multiply drop dupe push type equal not dupe push type equal
Computational class
If Stack could hold unbounded integers then it's Turing-complete by simulation of Volatile