We are currently working on new rules for what content should and shouldn't be allowed on this website, and are looking for feedback! See Esolang:2026 topicality proposal to view and give feedback on the current draft.
Snek
A stack-based language made almost entirely by the following characters: | _ / \. An instruction pointer moves along the "paths" made by these characters and commands are encoded as different numbers of each character in succession. Snek is so-called because of the tendencies for the program to look a bit like a snake with a long body and a @ as a head.
A single character is a noop, therefore you can move the instruction pointer without performing any operations.
List of Commands
______ = push number of _s - 1 | | = 2: add, 3: sub, 4: mul, 5: push 0, 6: div | \ \ = 2; dup, 3: swap, 4: get char input, 5: print as number, 6: print as ascii, \ / / = 2: ==, 3: >, 4: <, 5: >= 6: <= /
@ = ends program
Where the numbers represent the number of characters in a row.
Control Flow
When the instruction pointer comes across a fork in the path, it will choose the right path if the top value on the stack is zero and the left path if the value is one. Left and right are relative to the fork pointing upwards, like so:
left right
\ /
|
And likewise
___/ left \ right
Ambiguity in latyout
The ascii-art style of this language creates some ambiguity. Since the instruction pointer can only turn 45 degrees at once, examples such as this arise:
_ _ / / | |
Both of these are valid in Snek, however which one is picked if there are multiple options is not defined. Take this example:
__ /__ // |
This is undefined behaviour, it is implementation specific which path the instruction pointer will take.
Examples
Truth machine
This program takes a single character from the user, if it is 1 then it prints 1 forever, else it exits. This is an example of how loops and control flow can be used.
_
\
\ ____ _
\ _____/ \ / \ _@
\_____/ | | \ _/
| | \ / \__
| | | | / \
| | | | | \
\_/ | | \ \
\__/ | \
\ \
| |
\_/
Adder
This program takes 2 single digit numbers from the user, adds them and prints the result.
_
\
\
\ _____
\_____/ \
|
_ |
/ \_ |
| \ |
\ | \____
\ | \
\ | |
| \ |
| | |
| | |
| \ \
\_ \ \
\ \ \
| \ |
| \ |
| @ |
| \
\____ \
\ \
| \
/ |
| /
\_____ _ |
\_____/ \_/
Reference Interpreter
The reference interpreter is a work in progress. Knowing my track record with finishing projects, it may remain that way for a while. Pull requests are welcome.