Issue #361 - Ensure bound vars are known within scope

This commit is contained in:
Justin Ethier 2020-03-05 17:40:15 -05:00
parent a46b2ec6ae
commit 29b2872f54
2 changed files with 14 additions and 6 deletions

View file

@ -10,6 +10,10 @@ Features
make_c_opaque(opq, my_c_obj); make_c_opaque(opq, my_c_obj);
opaque_collect_ptr(&opq) = 1; // Cyclone's GC will free this memory 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 ## 0.15 - February 26, 2020
Features Features

View file

@ -903,11 +903,15 @@
;; At this point defines cannot be in lambda form. ;; At this point defines cannot be in lambda form.
;; EG: (define (f x) ...) ;; EG: (define (f x) ...)
((define? expr) ((define? expr)
(let ((bv* (cons (define->var expr) bv))) ;; #361 - Update parent list of bound variables to account
`(define ,(define->var expr) ;; for defined variable since it is within that scope
,@(map (if (null? bv)
(lambda (e) (clean e bv*)) (set! bv (list bv))
(define->exp expr))))) (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 ;; For now, assume set is not introducing a new binding
((set!? expr) ((set!? expr)
`(set! ,(clean (set!->var expr) bv) `(set! ,(clean (set!->var expr) bv)
@ -917,7 +921,7 @@
expr)) expr))
(else (else
(error "macro cleanup unexpected expression: " expr)))) (error "macro cleanup unexpected expression: " expr))))
(clean expr '())) (clean expr (list '____unused____)))
; TODO: get macro name, transformer ; TODO: get macro name, transformer