Show HN: Compiler Fundamentals – Closure Conversion
gist.github.com
gist.github.com
The idea is that this should help someone if they are a beginner wanting to implement a language that has lambda. Or anybody who is curious how a compiler might implement lambda.
Here's mine: https://github.com/sinistersnare/SinScheme/blob/master/src/r...
It's in my own Scheme variant, I'm afraid. I guess I should translate it to something people know. But, for example
;; Variable reference
(to (var-ref<- v)
(make ({.free-vars} (set<- v))
({.compile s k} (cons (s v) k))))
turns a source-code variable access into an AST object with two methods: 1. The free-variable set of this AST has just that one variable. 2. To compile this to bytecode, given a scope s and following code k, ask the scope what instruction to emit for this variable, and prepend that to k. (In general k is passed in for the sake of tail-call optimization, on line 33.) ((begin? exp)
`(begin . ,(mapply cc (cdr exp) sc)))
would become [`(begin ,xs ...)
`(begin ,@(mapply cc xs sc))]
or if you're feeling fancy (define cc-sc (curryr cc sc))
[`(begin ,(app cc-sc xs) ...) `(begin ,@xs)]