~ chicken-core (chicken-5) 22699fd729e2b1e08e8bdb2d6a5d640382d209d8


commit 22699fd729e2b1e08e8bdb2d6a5d640382d209d8
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sun May 2 01:14:02 2010 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sun May 2 01:14:02 2010 +0200

    map and for-each check argument types, when expanded by compiler syntax (reported by zbigniew); procedure argument is evaluated in correct order

diff --git a/compiler-syntax.scm b/compiler-syntax.scm
index 3f85aed3..78748a69 100644
--- a/compiler-syntax.scm
+++ b/compiler-syntax.scm
@@ -61,6 +61,7 @@
   (let ((%let (r 'let))
 	(%if (r 'if))
 	(%loop (r 'loop))
+	(%proc (gensym))
 	(%begin (r 'begin))
 	(%and (r 'and))
 	(%pair? (r 'pair?))
@@ -72,14 +73,19 @@
 		      (c %lambda (caadr x)))
 		 (symbol? (cadr x))))
 	(let ((vars (map (lambda _ (gensym)) lsts)))
-	  `(,%let ,%loop ,(map list vars lsts)
-		  (,%if (,%and ,@(map (lambda (v) `(,%pair? ,v)) vars))
-			(,%begin
-			 ((,%begin ,(cadr x))
-			  ,@(map (lambda (v) `(##sys#slot ,v 0)) vars))
-			 (##core#app 
-			  ,%loop
-			  ,@(map (lambda (v) `(##sys#slot ,v 1)) vars) ) ))))
+	  `(,%let ((,%proc ,(cadr x))
+		   ,@(map list vars lsts))
+		  ,@(map (lambda (var)
+			   `(##core#check (##sys#check-list ,var 'for-each)))
+			 vars)
+		  (,%let ,%loop ,(map list vars vars)
+			 (,%if (,%and ,@(map (lambda (v) `(,%pair? ,v)) vars))
+			       (,%begin
+				(,%proc
+				 ,@(map (lambda (v) `(##sys#slot ,v 0)) vars))
+				(##core#app 
+				 ,%loop
+				 ,@(map (lambda (v) `(##sys#slot ,v 1)) vars) ) )))))
 	x)))
 
 (define-internal-compiler-syntax ((map ##sys#map #%map) x r c)
@@ -87,11 +93,12 @@
   (let ((%let (r 'let))
 	(%if (r 'if))
 	(%loop (r 'loop))
-	(%res (r 'res))
+	(%res (gensym))
 	(%cons (r 'cons))
 	(%set! (r 'set!))
-	(%result (r 'result))
-	(%node (r 'node))
+	(%result (gensym))
+	(%node (gensym))
+	(%proc (gensym))
 	(%quote (r 'quote))
 	(%begin (r 'begin))
 	(%lambda (r 'lambda))
@@ -105,21 +112,27 @@
 		 (symbol? (cadr x))))
 	(let ((vars (map (lambda _ (gensym)) lsts)))
 	  `(,%let ((,%result (,%quote ()))
-		   (,%node #f))
-		  (,%let ,%loop ,(map list vars lsts)
-		       (,%if (,%and ,@(map (lambda (v) `(,%pair? ,v)) vars))
-			     (,%let ((,%res
-				      (,%cons
-				       ((,%begin ,(cadr x))
-					,@(map (lambda (v) `(##sys#slot ,v 0)) vars))
-				       (,%quote ()))))
-				    (,%if ,%node
-					  (##sys#setslot ,%node 1 ,%res)
-					  (,%set! ,%result ,%res))
-				    (,%set! ,%node ,%res)
-				    (,%loop
-				     ,@(map (lambda (v) `(##sys#slot ,v 1)) vars)))
-			     ,%result))))
+		   (,%node #f)
+		   (,%proc ,(cadr x))
+		   ,@(map list vars lsts))		   
+		  ,@(map (lambda (var)
+			   `(##core#check (##sys#check-list ,var 'map)))
+			 vars)
+		  (,%let ,%loop ,(map list vars vars)
+			 (,%if (,%and ,@(map (lambda (v) `(,%pair? ,v)) vars))
+			       (,%let ((,%res
+					(,%cons
+					 (,%proc
+					  ,@(map (lambda (v) `(##sys#slot ,v 0)) vars))
+					 (,%quote ()))))
+				      (,%if ,%node
+					    (##sys#setslot ,%node 1 ,%res)
+					    (,%set! ,%result ,%res))
+				      (,%set! ,%node ,%res)
+				      (##core#app
+				       ,%loop
+				       ,@(map (lambda (v) `(##sys#slot ,v 1)) vars)))
+			       ,%result))))
 	x)))
 
 (define-internal-compiler-syntax ((o #%o) x r c) ()
diff --git a/library.scm b/library.scm
index ff3f63c5..c2137a8e 100644
--- a/library.scm
+++ b/library.scm
@@ -445,8 +445,10 @@ EOF
 	  ((eq? x (##sys#slot lst 0)) (##sys#slot lst 1))
 	  (else (cons (##sys#slot lst 0) (loop (##sys#slot lst 1)))) ) ) )
 
-(define (##sys#error-not-a-proper-list arg . loc)
-  (##sys#error-hook (foreign-value "C_NOT_A_PROPER_LIST_ERROR" int) (and (pair? loc) (car loc)) arg) )
+(define (##sys#error-not-a-proper-list arg #!optional loc)
+  (##sys#error-hook
+   (foreign-value "C_NOT_A_PROPER_LIST_ERROR" int) 
+   loc arg))
 
 (define ##sys#not-a-proper-list-error ##sys#error-not-a-proper-list) ;DEPRECATED
 
Trap