From a06d2793c8de4246118f13ac08eba3e438d0ee20 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Wed, 14 Nov 2018 18:22:51 -0500 Subject: [PATCH] Do not accumulate free vars from our local (let)'s --- scheme/cyclone/transforms.sld | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/scheme/cyclone/transforms.sld b/scheme/cyclone/transforms.sld index acddb3af..f69449b4 100644 --- a/scheme/cyclone/transforms.sld +++ b/scheme/cyclone/transforms.sld @@ -623,6 +623,7 @@ ; free-vars : exp -> sorted-set[var] (define (free-vars ast . opts) + (define let-vars '()) (define bound-only? (and (not (null? opts)) (car opts))) @@ -636,7 +637,10 @@ ((const? exp) '()) ((prim? exp) '()) ((quote? exp) '()) - ((ref? exp) (if bound-only? '() (list exp))) + ((ref? exp) + (if (member exp let-vars) + '() + (if bound-only? '() (list exp)))) ((lambda? exp) (difference (reduce union (map search (lambda->exp exp)) '()) (lambda-formals->list exp))) @@ -648,6 +652,9 @@ ((define-c? exp) (list (define->var exp))) ((set!? exp) (union (list (set!->var exp)) (search (set!->exp exp)))) + ((tagged-list? 'let exp) + (set! let-vars (append (map car (cadr exp)) let-vars)) + (search (cdr exp))) ; Application: ((app? exp) (reduce union (map search exp) '())) (else (error "unknown expression: " exp))))