diff --git a/scheme/cyclone/transforms.sld b/scheme/cyclone/transforms.sld index 943dd557..e638ee14 100644 --- a/scheme/cyclone/transforms.sld +++ b/scheme/cyclone/transforms.sld @@ -1164,6 +1164,9 @@ (define (analyze-mutable-variables exp) (cond ; Core forms: + ((ast:lambda? exp) + (map analyze-mutable-variables (ast:lambda-body exp)) + (void)) ((const? exp) (void)) ((prim? exp) (void)) ((ref? exp) (void)) @@ -1171,9 +1174,6 @@ ((lambda? exp) (map analyze-mutable-variables (lambda->exp exp)) (void)) - ((ast:lambda? exp) - (map analyze-mutable-variables (ast:lambda-body exp)) - (void)) ((set!? exp) (mark-mutable (set!->var exp)) (analyze-mutable-variables (set!->exp exp))) @@ -1617,6 +1617,23 @@ (define (convert exp self-var free-var-lst) (define (cc exp) (cond + ((ast:lambda? exp) + (let* ((new-self-var (gensym 'self)) + (body (ast:lambda-body exp)) + (new-free-vars + (difference + (difference (free-vars body) (ast:lambda-formals->list exp)) + globals))) + `(%closure + (lambda + ,(list->lambda-formals + (cons new-self-var (ast:lambda-formals->list exp)) + (ast:lambda-formals-type exp)) + ,(convert (car body) new-self-var new-free-vars)) ;; TODO: should this be a map??? was a list in 90-min-scc. + ;,(convert body new-self-var new-free-vars)) ;; TODO: should this be a map??? was a list in 90-min-scc. + ,@(map (lambda (v) ;; TODO: splice here? + (cc v)) + new-free-vars)))) ((const? exp) exp) ((quote? exp) exp) ((ref? exp) @@ -1634,22 +1651,6 @@ ,@(map cc (cdr exp)))) ;; TODO: need to splice? ((set!? exp) `(set! ,(set!->var exp) ,(cc (set!->exp exp)))) - ((ast:lambda? exp) - (let* ((new-self-var (gensym 'self)) - (body (ast:lambda-body exp)) - (new-free-vars - (difference - (difference (free-vars body) (ast:lambda-formals->list exp)) - globals))) - `(%closure - (lambda - ,(list->lambda-formals - (cons new-self-var (ast:lambda-formals->list exp)) - (ast:lambda-formals-type exp)) - ,(convert (car body) new-self-var new-free-vars)) ;; TODO: should this be a map??? was a list in 90-min-scc. - ,@(map (lambda (v) ;; TODO: splice here? - (cc v)) - new-free-vars)))) ((if? exp) `(if ,@(map cc (cdr exp)))) ((cell? exp) `(cell ,(cc (cell->value exp)))) ((cell-get? exp) `(cell-get ,(cc (cell-get->cell exp))))