mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-04 03:36:34 +02:00
Keep vars in local let's during closure convert
This commit is contained in:
parent
78b12779af
commit
cde576aaa3
1 changed files with 11 additions and 0 deletions
|
@ -1695,6 +1695,9 @@
|
||||||
(else
|
(else
|
||||||
(loop (cdr lst) (+ i 1))))))
|
(loop (cdr lst) (+ i 1))))))
|
||||||
|
|
||||||
|
(define (let->vars exp)
|
||||||
|
(map car (cadr exp)))
|
||||||
|
|
||||||
(define (closure-convert exp globals . opts)
|
(define (closure-convert exp globals . opts)
|
||||||
(let ((optimization-level 2))
|
(let ((optimization-level 2))
|
||||||
(if (pair? opts)
|
(if (pair? opts)
|
||||||
|
@ -1751,6 +1754,14 @@
|
||||||
,@(map cc (cdr exp)))) ;; TODO: need to splice?
|
,@(map cc (cdr exp)))) ;; TODO: need to splice?
|
||||||
((set!? exp) `(set! ,(set!->var exp)
|
((set!? exp) `(set! ,(set!->var exp)
|
||||||
,(cc (set!->exp 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)))
|
((lambda? exp) (error `(Unexpected lambda in closure-convert ,exp)))
|
||||||
((if? exp) `(if ,@(map cc (cdr exp))))
|
((if? exp) `(if ,@(map cc (cdr exp))))
|
||||||
((cell? exp) `(cell ,(cc (cell->value exp))))
|
((cell? exp) `(cell ,(cc (cell->value exp))))
|
||||||
|
|
Loading…
Add table
Reference in a new issue