From: Luke Lau Date: Mon, 22 Jul 2019 19:41:24 +0000 (+0100) Subject: Add recursive let-bindings X-Git-Url: http://git.lukelau.me/?p=scheme.git;a=commitdiff_plain;h=8aacba5976424791fb51d5d36118269d32c4096a Add recursive let-bindings --- 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))