From: Luke Lau Date: Tue, 30 Jul 2019 21:25:15 +0000 (+0100) Subject: Merge branch 'master' of lukelau.me:/srv/git/scheme X-Git-Url: https://git.lukelau.me/?p=scheme.git;a=commitdiff_plain;h=ab0b66e68a85e8e71442ee70a81c16d04e66145d;hp=-c Merge branch 'master' of lukelau.me:/srv/git/scheme --- ab0b66e68a85e8e71442ee70a81c16d04e66145d diff --combined abi.md index eafb174,28f81c4..c2ff165 --- a/abi.md +++ b/abi.md @@@ -11,6 -11,15 +11,15 @@@ when allocating, use first free block, 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 @@@ -26,19 -35,6 +35,19 @@@ lambda code 1st 2nd 3r 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.