X-Git-Url: http://git.lukelau.me/?p=scheme.git;a=blobdiff_plain;f=codegen.scm;h=e1b51a60a5ac6c9fcde9f23dd4ca58e9c02f2274;hp=d30adc54e61a144097c3b0bb541a5835af8c028a;hb=8aacba5976424791fb51d5d36118269d32c4096a;hpb=e51b9e423665428c41cddac0642d1e34b18ca1da diff --git a/codegen.scm b/codegen.scm index d30adc5..e1b51a6 100644 --- a/codegen.scm +++ b/codegen.scm @@ -51,12 +51,17 @@ (inner-si (- si (* (length bindings) wordsize))) (names (map car bindings)) (exprs (map cadr bindings)) - (inner-env (append (map cons names stack-offsets) env))) - (for-each (lambda (expr offset) + + ; recursive let bindings: build environment as we go + (inner-env (fold-left + (lambda (env name expr offset) (codegen-expr expr inner-si env) - (emit "movq %rax, ~a(%rsp)" offset)) - exprs stack-offsets) - (for-each (lambda (form) (codegen-expr form inner-si inner-env)) body))) + (emit "movq %rax, ~a(%rsp)" offset) + (cons (cons name offset) env)) + env names exprs stack-offsets))) + (for-each (lambda (form) + (codegen-expr form inner-si inner-env)) + body))) (define (codegen-var name si env) (when (not (assoc name env))