aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
blob: 1f085b1462b31710a4be746dc11f0f4e8d9103d4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# Reverse Polish Scheme

A continuation-passing-style stack-based programming language vaguely
based off of FORTH but really just Scheme in disguise. With the exception
of quotation (which is syntax), everything is RPN.

## Core

Writing a number, a string, `#t`, `#f`, or `#nil` will push that literal
value onto the stack. Strings are equivalent to Scheme symbols. `#nil`
is the name of a value, NOT the symbol `"nil"`!

A linked list is a 2-vector whose second pair is either `#nil` or
another linked list.

A subroutine is a linked list whose first slot is unused and whose code
starts in the second slot.

* `n alloc`: Allocate a memory region of `n` pointers.
* `{ ... }`: Reads all data up to the matching `{` as data. The data
  is stored as a linked list.
* `n v ref`: Get the nth element of `v`.
* `value n v set!`: Set the nth element of `v`.
* `sr jump`: Jump to a subroutine.
* `conditional on-false on-true if`: If `conditional` is truthy, jump
  to `on-true`. Otherwise jump to `on-false`.
* `keep-bot keep-top push-cc`: Push the *continuation* of the call to
  `push-cc`. The continuation object saves the last `keep-top` objects
  on the stack along with the bottom `keep-bot` values on the stack. If
  either is `#f`, then the entire stack is saved.

  When `m cc jump` is called (where `cc` is the object returned by
  `push-cc`), the `m` values currently on the stack are pushed to the top
  of `n` values saved by `cc`, and control returns to the next location.
* `dir? n dig`: When `dir?` is false, move the `n`th value relative to the
  top of the stack to the top of the stack. When `dir?` is true, move the
  `n`th value relative to the bottom of the stack to the top of the stack.
* `dir? n bury`: When `dir?` is false, move the top value on the stack to
  the `n`th value relative to the top of the stack. When `dir?` is true,
  move the top of the stack to `n`th value relative to the bottom of
  the stack.