# Reverse Polish Scheme A 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. There are only jumps in this language: in order to return from a procedure, you need to capture the current continuation and pass it to the procedure. ## 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 procedure 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 procedure. * `conditional on-false on-true if`: If `conditional` is truthy, jump to `on-true`. Otherwise jump to `on-false`. * `proc keep-bot keep-top call/cc`: Jump to `proc` with the continuation pushed to the stack. 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 `call/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 after `call/cc`. * `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. * `dup`: Duplicate the top of the stack. This is a shallow copy. * `drop`: Drop the top of the stack. * `x y eqv?`: Compare two values on the top of the stack, returns a boolean.