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