~ chicken-core (chicken-5) 4c57d2cba9c756c7ceaeea9b38c8bc0a028dcf7c


commit 4c57d2cba9c756c7ceaeea9b38c8bc0a028dcf7c
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Jun 18 21:54:21 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sat Jun 18 21:54:21 2011 +0200

    use proper environment in eval/meta for compile-time evaluation, factored it out into ##sys#eval/meta

diff --git a/compiler.scm b/compiler.scm
index f1510bfa..80c426c1 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -471,25 +471,6 @@
 	    ((not (memq x e)) (##sys#alias-global-hook x #f h)) ; only if global
 	    (else x))))
   
-  (define (eval/meta form)
-    (let ((oldcm (##sys#current-module))
-	  (oldme (##sys#macro-environment))
-	  (mme (##sys#meta-macro-environment)))
-      (dynamic-wind
-	  (lambda () 
-	    (##sys#current-module #f)
-	    (##sys#macro-environment mme))
-	  (lambda ()
-	    ((##sys#compile-to-closure
-	      form
-	      '() 
-	      (##sys#current-meta-environment))
-	     '() ) )
-	  (lambda ()
-	    (##sys#current-module oldcm)
-	    (##sys#meta-macro-environment (##sys#macro-environment))
-	    (##sys#macro-environment oldme)))))
-
   (define (emit-import-lib name il)
     (let* ((fname (if all-import-libraries
 		      (string-append (symbol->string name) ".import.scm")
@@ -686,7 +667,7 @@
 					     (car b)
 					     se
 					     (##sys#er-transformer
-					      (eval/meta (cadr b)))))
+					      (##sys#eval/meta (cadr b)))))
 					  (cadr x) )
 				     se) ) )
 			   (walk
@@ -700,7 +681,7 @@
 					   (car b)
 					   #f
 					   (##sys#er-transformer
-					    (eval/meta (cadr b)))))
+					    (##sys#eval/meta (cadr b)))))
 					(cadr x) ) )
 			       (se2 (append ms se)) )
 			  (for-each 
@@ -727,7 +708,7 @@
 			  (##sys#extend-macro-environment
 			   name
 			   (##sys#current-environment)
-			   (##sys#er-transformer (eval/meta body)))
+			   (##sys#er-transformer (##sys#eval/meta body)))
 			  (walk
 			   (if ##sys#enable-runtime-macros
 			       `(##sys#extend-macro-environment
@@ -750,7 +731,7 @@
 			   name '##compiler#compiler-syntax
 			   (and body
 				(##sys#cons
-				 (##sys#er-transformer (eval/meta body))
+				 (##sys#er-transformer (##sys#eval/meta body))
 				 (##sys#current-environment))))
 			  (walk 
 			   (if ##sys#enable-runtime-macros
@@ -772,7 +753,8 @@
 				       (list 
 					name 
 					(and (pair? (cdr b))
-					     (cons (##sys#er-transformer (eval/meta (cadr b))) se))
+					     (cons (##sys#er-transformer
+						    (##sys#eval/meta (cadr b))) se))
 					(##sys#get name '##compiler#compiler-syntax) ) ) )
 				   (cadr x))))
 			  (dynamic-wind
@@ -979,11 +961,11 @@
 
 			((##core#compiletimetoo ##core#elaborationtimetoo)
 			 (let ((exp (cadr x)))
-			   (eval/meta exp)
+			   (##sys#eval/meta exp)
 			   (walk exp e se dest #f h) ) )
 
 			((##core#compiletimeonly ##core#elaborationtimeonly)
-			 (eval/meta (cadr x))
+			 (##sys#eval/meta (cadr x))
 			 '(##core#undefined) )
 
 			((##core#begin ##core#toplevel-begin) 
diff --git a/eval.scm b/eval.scm
index c296ccaf..a52d2660 100644
--- a/eval.scm
+++ b/eval.scm
@@ -231,32 +231,6 @@
       (define (decorate p ll h cntr)
 	(##sys#eval-decorator p ll h cntr) )
 
-      (define (eval/meta form)
-	(let ((oldcm (##sys#current-module))
-	      (oldme (##sys#macro-environment))
-	      (mme (##sys#meta-macro-environment)))
-	  (dynamic-wind
-	      (lambda () 
-		(##sys#current-module #f)
-		(##sys#macro-environment mme))
-	      (lambda ()
-		((##sys#compile-to-closure
-		  form
-		  '() 
-		  (##sys#current-meta-environment))
-		 '() ) )
-	      (lambda ()
-		(##sys#current-module oldcm)
-		(##sys#meta-macro-environment (##sys#macro-environment))
-		(##sys#macro-environment oldme)))))
-
-      (define (eval/elab form)
-	((##sys#compile-to-closure
-	  form
-	  '() 
-	  (##sys#current-environment))
-	 '() ) )
-
       (define (compile x e h tf cntr se)
 	(cond ((keyword? x) (lambda v x))
 	      ((symbol? x)
@@ -326,7 +300,7 @@
 		 (d `(EVAL/EXPANDED: ,x2))
 		 (if (not (eq? x2 x))
 		     (compile x2 e h tf cntr se)
-		     (let ((head (rename (##sys#slot x 0) se))) 
+		     (let ((head (rename (##sys#slot x 0) se)))
 		       ;; here we did't resolve ##core#primitive, but that is done in compile-call (via 
 		       ;; a normal walking of the operator)
 		       (case head
@@ -580,7 +554,7 @@
 					      (car b)
 					      se
 					      (##sys#er-transformer
-					       (eval/meta (cadr b)))))
+					       (##sys#eval/meta (cadr b)))))
 					   (cadr x) ) 
 				      se) ) )
 			    (compile
@@ -593,7 +567,7 @@
 					     (car b)
 					     #f
 					     (##sys#er-transformer
-					      (eval/meta (cadr b)))))
+					      (##sys#eval/meta (cadr b)))))
 					  (cadr x) ) )
 				 (se2 (append ms se)) )
 			    (for-each 
@@ -614,7 +588,7 @@
 			    (##sys#extend-macro-environment
 			     name
 			     (##sys#current-environment)
-			     (##sys#er-transformer (eval/meta body)))
+			     (##sys#er-transformer (##sys#eval/meta body)))
 			    (compile '(##core#undefined) e #f tf cntr se) ) )
 
 			 ((##core#define-compiler-syntax)
@@ -693,8 +667,7 @@
 			  (compile `(,(rename 'lambda se) ,@(cdr x)) e #f tf cntr se) ]
 
 			 [(##core#require-for-syntax)
-			  (let ([ids (map (lambda (x)
-					    (eval/meta x))
+			  (let ([ids (map (lambda (x) (##sys#eval/meta x))
 					  (cdr x))])
 			    (apply ##sys#require ids)
 			    (let ([rs (##sys#lookup-runtime-requirements ids)])
@@ -718,7 +691,7 @@
 			     e #f tf cntr se) ) ]
 
 			 [(##core#elaborationtimeonly ##core#elaborationtimetoo) ; <- Note this!
-			  (eval/meta (cadr x))
+			  (##sys#eval/meta (cadr x))
 			  (compile '(##core#undefined) e #f tf cntr se) ]
 
 			 [(##core#compiletimetoo)
@@ -815,6 +788,30 @@
 
       (compile exp env #f (fx> (##sys#eval-debug-level) 0) cntr se) ) ) )
 
+
+;;; evaluate in the macro-expansion/compile-time environment
+(define (##sys#eval/meta form)
+  (let ((oldcm (##sys#current-module))
+	(oldme (##sys#macro-environment))
+	(mme (##sys#meta-macro-environment))
+	(aee ##sys#active-eval-environment))
+    (dynamic-wind
+	(lambda () 
+	  (##sys#current-module #f)
+	  (##sys#macro-environment mme)
+	  (set! ##sys#active-eval-environment ##sys#current-meta-environment))
+	(lambda ()
+	  ((##sys#compile-to-closure
+	    form
+	    '() 
+	    (##sys#current-meta-environment))
+	   '() ) )
+	(lambda ()
+	  (set! ##sys#active-eval-environment aee)
+	  (##sys#current-module oldcm)
+	  (##sys#meta-macro-environment (##sys#macro-environment))
+	  (##sys#macro-environment oldme)))))
+
 (define ##sys#eval-handler 
   (make-parameter
    (lambda (x . env)
diff --git a/expand.scm b/expand.scm
index fecf0c53..2a064a4b 100644
--- a/expand.scm
+++ b/expand.scm
@@ -59,6 +59,7 @@
 
 (define ##sys#current-environment (make-parameter '()))
 (define ##sys#current-meta-environment (make-parameter '()))
+(define ##sys#active-eval-environment ##sys#current-environment)
 
 (define (lookup id se)
   (cond ((##core#inline "C_u_i_assq" id se) => cdr)
diff --git a/modules.scm b/modules.scm
index 2208c35d..76532166 100644
--- a/modules.scm
+++ b/modules.scm
@@ -37,6 +37,12 @@
 (define-alias dm d)
 (define-alias dx d)
 
+#+debugbuild
+(define (map-se se)
+  (map (lambda (a) 
+	 (cons (car a) (if (symbol? (cdr a)) (cdr a) '<macro>)))
+       se))
+
 (define-inline (getp sym prop)
   (##core#inline "C_i_getprop" sym prop #f))
 
@@ -712,10 +718,10 @@
 	((getp sym '##core#aliased) 
 	 (dm "(ALIAS) marked: " sym)
 	 sym)
-	((assq sym (##sys#current-environment)) =>
+	((assq sym (##sys#active-eval-environment)) =>
 	 (lambda (a)
-	   (dm "(ALIAS) in current environment: " sym)
 	   (let ((sym2 (cdr a)))
+	     (dm "(ALIAS) in current environment " sym " -> " sym2)
 	     (if (pair? sym2)		; macro (*** can this be?)
 		 (mrename sym)
 		 (or (getp sym2 '##core#primitive) sym2)))))
diff --git a/tests/runtests.sh b/tests/runtests.sh
index 83d544f0..ae364544 100644
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -130,7 +130,7 @@ echo "======================================== syntax tests (compiled) ..."
 $compile syntax-tests.scm
 ./a.out
 
-echo "======================================== syntax tests (2, compiled) ..."
+echo "======================================== syntax tests (v2, compiled) ..."
 $compile syntax-tests-2.scm
 ./a.out
 
@@ -233,9 +233,6 @@ $interpret -bnq ec.so ec-tests.scm
 # $compile ec-tests.scm
 # ./a.out        # takes ages to compile
 
-echo "======================================== arithmetic tests ..."
-$interpret -D check -s arithmetic-test.scm
-
 echo "======================================== hash-table tests ..."
 $interpret -s hash-table-tests.scm
 
diff --git a/tests/syntax-tests.scm b/tests/syntax-tests.scm
index ca80ec87..c3ba70fa 100644
--- a/tests/syntax-tests.scm
+++ b/tests/syntax-tests.scm
@@ -914,3 +914,18 @@
   (set-cdr! a a)
   `(1 ,@a))
 
+
+;; ##sys#alias-global-hook, when invoked via eval/meta, did resolve identifiers
+;; used during evaluation of an expander body in the wrong environment and mapped
+;; an identifier to something imported for the runtime environment
+
+(module foonumbers (+)
+  (import (except scheme +) chicken)
+  (define (+ . _) (error "failed.")))
+
+(import foonumbers)
+
+(define-syntax (foo x r c)
+  `(print ,(+ (cadr x) 1)))
+
+(foo 3)
Trap