Finish stack walking, mark+sweep for GC
diff --git a/doc/lisp-std.rst b/doc/lisp-std.rst
new file mode 100644
index 0000000..b0a33f8
--- /dev/null
+++ b/doc/lisp-std.rst
@@ -0,0 +1,54 @@
+Lisp Standard Library
+=====================
+
+This provides documentation for every built-in function in the Lisp standard
+library. It is not auto-generated, please update this documentation if you
+change the API in any way.
+
+In general every user-facing API in the standard library should be documented
+here.
+
+Built-in "functions"
+--------------------
+
+.. function:: (if condition true-condition [false-condition])
+
+ Evaluates ``condition``, if it is truthy (non-``nil``) ``true-condition`` is
+ evaluated. Otherwise ``false-condition`` is evaluated. If
+ ``false-condition`` is not provided, ``if`` will evaluate to ``nil``.
+
+.. function:: (let1 (variable binding) & body)
+
+ Evaluates ``binding`` and binds it to ``variable``, then evaluates ``body``.
+ After ``body`` is evaluated ``variable`` is unbound.
+
+ .. code-block:: lisp
+
+ (let1 (greeting (greet "John"))
+ (do-something greeting)
+ (print greeting))
+ ; greeting is no longer bound
+
+.. function:: (gc)
+
+ Force the garbage collector (GC) to run.
+
+Functions
+---------
+
+.. function:: (car pair)
+
+ Return the first item in ``pair``.
+
+.. function:: (cdr pair)
+
+ Return the second (last) item in ``pair``.
+
+.. function:: (cons a b)
+
+ Return a cons-pair containing ``a`` and ``b``.
+
+.. function:: (print val)
+
+ Print out ``val`` to standard output. This will not be formatted as an
+ s-expression, but in a manner more similar to the internal representation.
\ No newline at end of file