A 2D esoteric language where code flows like wind. GitHub · SPEC
Every cell is one Unicode codepoint. Outside string mode, the IP
decodes its current cell as one of these opcodes; inside string
mode (toggled by ") every cell except "
pushes its codepoint to the stack instead.
| Cat | Glyph | Name | Effect |
|---|---|---|---|
| Flow | · | NOP | Do nothing. |
| Flow | @ | HALT | Remove the executing IP from the live list. When empty, the program ends. |
| Flow | # | TRAMPOLINE | Advance an extra step (skip the next cell). |
| Flow | t | SPLIT | Spawn a new IP at (x − dx, y − dy) going (−dx, −dy); empty stack, strmode off. |
| Wind | → > | MOVE_E | dir ← (+1, 0) |
| Wind | ↗ | MOVE_NE | dir ← (+1, −1) |
| Wind | ↑ ^ | MOVE_N | dir ← (0, −1) |
| Wind | ↖ | MOVE_NW | dir ← (−1, −1) |
| Wind | ← < | MOVE_W | dir ← (−1, 0) |
| Wind | ↙ | MOVE_SW | dir ← (−1, +1) |
| Wind | ↓ v | MOVE_S | dir ← (0, +1) |
| Wind | ↘ | MOVE_SE | dir ← (+1, +1) |
| Wind | ~ | TURBULENCE | Pick a random direction from the eight winds. Use --seed for reproducibility. |
| Speed | ≫ | GUST | speed += 1. The IP advances speed cells per tick; only the destination decodes. |
| Speed | ≪ | CALM | speed −= 1; runtime trap (exit 134) if it would yield 0. |
| Lit | 0…9 | PUSH_DIGIT | Push the digit's integer value (0–9). |
| Lit | " | STR_MODE | Toggle string mode. |
| Arith | + | ADD | b ← pop; a ← pop; push a + b |
| Arith | − | SUB | push a − b |
| Arith | * | MUL | push a × b |
| Arith | / | DIV | Floor division. b == 0 ⇒ push 0. |
| Arith | % | MOD | Floor modulo. b == 0 ⇒ push 0. |
| Arith | ! | NOT | push 1 if a == 0 else 0 |
| Arith | ` | GT | push 1 if a > b else 0 |
| Stack | : | DUP | Duplicate the top. |
| Stack | $ | DROP | Discard the top. |
| Stack | \ | SWAP | Swap the top two. |
| Branch | _ | IF_H | a ← pop; dir ← east if a == 0 else west |
| Branch | | | IF_V | a ← pop; dir ← south if a == 0 else north |
| I/O | . | PUT_NUM | Pop, write decimal repr followed by a space. |
| I/O | , | PUT_CHR | Pop codepoint, write as a Unicode character. |
| I/O | & | GET_NUM | Read one decimal integer from stdin (EOF → −1). |
| I/O | ? | GET_CHR | Read one Unicode character; push codepoint (EOF → −1). |
| Grid | g | GRID_GET | y ← pop; x ← pop; push G[(x, y)] (missing ⇒ 0x20). |
| Grid | p | GRID_PUT | y ← pop; x ← pop; v ← pop; G[(x, y)] ← v |
Stack underflow yields 0 (no trap). Pop from empty,
divide by zero, and unknown glyphs are all explicitly defined —
see SPEC §7.
Each IP carries a positive-integer speed (default 1)
and advances speed cells per tick — only the
destination cell decodes (SPEC §3.7).
End-of-tick coincidence triggers a
collision merge
(§3.8): stacks concatenate in birth order, directions sum and
clip ((0,0) ⇒ merged IP dies), speed becomes
max, strmode resets. Toggle v0 legacy
in the toolbar to disable both and reproduce the v0.4 surface.