space on it is stored in `heap_start`. it needs to be
updated/decremented whenever you put anything on the heap
+## todo
+- how should allocation be managed?
+make free blocks a doubly linked list. (how big is a block?)
+when allocating, use first free block, move up free pointer
+when freeing, do ???
+
+
+# ownership
+
+```
+(let ([s "hello"]) <- s should be a linear string
+ (mkpair
+ (lambda () (print s)) <- two references to s?
+ (lambda () (print (reverse s)))))
+```
+
# closures
* lambda: actual function containing the code
address captive captive captive ...
```
+## note on recursive closures
+
+The following example shows a recursive lambda, that results in a
+closure that captures itself.
+```
+(let ([f (closure lambda0 (f))])
+ (f 42))
+```
+When this happens, `codegen-let` will insert `(f . 'self-captive)`
+into the environment when codegen'ing the closure. `codegen-closure`
+will then pick this up, and use it to insert its own heap address into
+its inner environment.
+
# lambdas
lambdas use the system v amd64 calling convention.