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);
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

View file

@ -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