diff --git a/CHANGELOG.md b/CHANGELOG.md index 9da479e3..089fe60c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,10 @@ Features make_c_opaque(opq, my_c_obj); opaque_collect_ptr(&opq) = 1; // Cyclone's GC will free this memory +Bug Fixes + +- Fixed a bug where variables defined within `define-syntax` and `let-syntax` are reported as unbound by the compiler. + ## 0.15 - February 26, 2020 Features diff --git a/scheme/eval.sld b/scheme/eval.sld index 72d311e5..7b3a1667 100644 --- a/scheme/eval.sld +++ b/scheme/eval.sld @@ -903,11 +903,15 @@ ;; At this point defines cannot be in lambda form. ;; EG: (define (f x) ...) ((define? expr) - (let ((bv* (cons (define->var expr) bv))) - `(define ,(define->var expr) - ,@(map - (lambda (e) (clean e bv*)) - (define->exp expr))))) + ;; #361 - Update parent list of bound variables to account + ;; for defined variable since it is within that scope + (if (null? bv) + (set! bv (list bv)) + (set-cdr! bv (cons (define->var expr) (cdr bv)))) + `(define ,(define->var expr) + ,@(map + (lambda (e) (clean e bv)) + (define->exp expr)))) ;; For now, assume set is not introducing a new binding ((set!? expr) `(set! ,(clean (set!->var expr) bv) @@ -917,7 +921,7 @@ expr)) (else (error "macro cleanup unexpected expression: " expr)))) - (clean expr '())) + (clean expr (list '____unused____))) ; TODO: get macro name, transformer