aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2025-06-08 00:23:18 -0400
committerGravatar Peter McGoron 2025-06-08 00:23:18 -0400
commitce82d10487a0a3496c3257aa674da1782b0f3703 (patch)
treec1c491134ad5bbb0175396ccb78202d420956dba /README.md
parentRPS interpreter (diff)
use the more tractable call/cc
Diffstat (limited to '')
-rw-r--r--README.md28
1 files changed, 17 insertions, 11 deletions
diff --git a/README.md b/README.md
index 1f085b1..7db8e1a 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,10 @@
# 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.
+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
@@ -13,7 +15,7 @@ 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
+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.
@@ -21,17 +23,18 @@ starts in the second slot.
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.
+* `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`.
-* `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.
+* `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
- `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.
+ `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.
@@ -39,3 +42,6 @@ starts in the second slot.
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.