From cde576aaa3d6549f7eb16ea1f2c378496b613f0a Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Mon, 12 Nov 2018 18:28:49 -0500 Subject: [PATCH] Keep vars in local let's during closure convert --- scheme/cyclone/cps-optimizations.sld | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scheme/cyclone/cps-optimizations.sld b/scheme/cyclone/cps-optimizations.sld index 91f63451..e946aac3 100644 --- a/scheme/cyclone/cps-optimizations.sld +++ b/scheme/cyclone/cps-optimizations.sld @@ -1695,6 +1695,9 @@ (else (loop (cdr lst) (+ i 1)))))) +(define (let->vars exp) + (map car (cadr exp))) + (define (closure-convert exp globals . opts) (let ((optimization-level 2)) (if (pair? opts) @@ -1751,6 +1754,14 @@ ,@(map cc (cdr exp)))) ;; TODO: need to splice? ((set!? exp) `(set! ,(set!->var exp) ,(cc (set!->exp exp)))) + ((tagged-list? 'let exp) ;; Special case now with local var redux + `(let + ,(cadr exp) + ,@(convert + (caddr exp) + self-var + (filter (lambda (v) (not (member v (let->vars exp)))) free-var-lst))) + ) ((lambda? exp) (error `(Unexpected lambda in closure-convert ,exp))) ((if? exp) `(if ,@(map cc (cdr exp)))) ((cell? exp) `(cell ,(cc (cell->value exp))))