Merge branch 'master' of lukelau.me:/srv/git/scheme
[scheme.git] / abi.md
diff --git a/abi.md b/abi.md
index 28f81c4152683ee00ae2a3c77daa166fd6f92959..c2ff16575c1da283f8c4d9c63a06d24c5ebe96ce 100644 (file)
--- a/abi.md
+++ b/abi.md
@@ -35,6 +35,19 @@ lambda code  1st        2nd       3rd
 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.