~ 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