~ chicken-core (chicken-5) 2483f8d05c28e70f0e7f728764fe093f21e8394e
commit 2483f8d05c28e70f0e7f728764fe093f21e8394e Author: felix <felix@call-with-current-continuation.org> AuthorDate: Mon Oct 24 11:11:48 2011 +0200 Commit: Christian Kellermann <ckeen@pestilenz.org> CommitDate: Wed Oct 26 11:14:19 2011 +0200 check not necessary for lambda and warn if using keyword as variable in binding form Signed-off-by: Christian Kellermann <ckeen@pestilenz.org> diff --git a/compiler.scm b/compiler.scm index cb9b2479..d907f633 100644 --- a/compiler.scm +++ b/compiler.scm @@ -501,6 +501,11 @@ (for-each pretty-print imps) (print "\n;; END OF FILE"))))) ) ) + (define (checkvar name form) + (when (keyword? name) + (warning "variable is keyword in binding form" `(,form (... (,name ...) ...) ...))) + name) + (define (walk x e se dest ldest h) (cond ((symbol? x) (cond ((keyword? x) `(quote ,x)) @@ -618,7 +623,7 @@ ((##core#let) (let* ((bindings (cadr x)) (vars (unzip1 bindings)) - (aliases (map gensym vars)) + (aliases (map (o gensym (cut checkvar <> 'let)) vars)) (se2 (##sys#extend-se se vars aliases))) (set-real-names! aliases vars) `(let @@ -636,7 +641,7 @@ (walk `(##core#let ,(map (lambda (b) - (list (car b) '(##core#undefined))) + (list (checkvar (car b) 'letrec) '(##core#undefined))) bindings) ,@(map (lambda (b) `(##core#set! ,(car b) ,(cadr b))) @@ -686,7 +691,7 @@ (let ((se2 (append (map (lambda (b) (list - (car b) + (checkvar (car b) 'let-syntax) se (##sys#ensure-transformer (##sys#eval/meta (cadr b)) @@ -701,7 +706,7 @@ ((##core#letrec-syntax) (let* ((ms (map (lambda (b) (list - (car b) + (checkvar (car b) 'letrec-syntax) #f (##sys#ensure-transformer (##sys#eval/meta (cadr b)) @@ -776,8 +781,11 @@ ((##core#let-compiler-syntax) (let ((bs (map (lambda (b) - (##sys#check-syntax 'let-compiler-syntax b '(symbol . #(_ 0 1))) - (let ((name (lookup (car b) se))) + (##sys#check-syntax + 'let-compiler-syntax b '(symbol . #(_ 0 1))) + (let ((name (lookup + (checkvar (car b) 'let-compiler-syntax) + se))) (list name (and (pair? (cdr b)) diff --git a/eval.scm b/eval.scm index 0ad85b40..e66462cb 100644 --- a/eval.scm +++ b/eval.scm @@ -231,6 +231,11 @@ (define (decorate p ll h cntr) (##sys#eval-decorator p ll h cntr) ) + (define (checkvar name form) + (when (keyword? name) + (warning "variable is keyword in binding form" `(,form (... (,name ...) ...) ...))) + name) + (define (compile x e h tf cntr se) (cond ((keyword? x) (lambda v x)) ((symbol? x) @@ -372,7 +377,7 @@ [(##core#let) (let* ([bindings (cadr x)] [n (length bindings)] - [vars (map (lambda (x) (car x)) bindings)] + [vars (map (lambda (x) (checkvar (car x) 'let)) bindings)] (aliases (map gensym vars)) [e2 (cons aliases e)] (se2 (##sys#extend-se se vars aliases)) @@ -424,7 +429,8 @@ (compile `(##core#let ,(##sys#map (lambda (b) - (list (car b) '(##core#undefined))) + (list (checkvar (car b) 'letrec) + '(##core#undefined))) bindings) ,@(##sys#map (lambda (b) `(##core#set! ,(car b) ,(cadr b))) @@ -529,7 +535,7 @@ (let ((se2 (append (map (lambda (b) (list - (car b) + (checkvar (car b) 'let-syntax) se (##sys#ensure-transformer (##sys#eval/meta (cadr b)) @@ -543,7 +549,7 @@ ((##core#letrec-syntax) (let* ((ms (map (lambda (b) (list - (car b) + (checkvar (car b) 'letrec-syntax) #f (##sys#ensure-transformer (##sys#eval/meta (cadr b))Trap