~ chicken-core (chicken-5) fe4e2db7b36c46028f9dadcda19010d1f684c406


commit fe4e2db7b36c46028f9dadcda19010d1f684c406
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Nov 10 11:21:51 2023 +0100
Commit:     Peter Bex <peter@more-magic.net>
CommitDate: Fri Nov 10 14:47:36 2023 +0100

    Resolve macro-aliases for static evaluation environments (#1295)
    
    When evaluating forms in a "static" environment, identifiers are
    not resolved using our old friend ##sys#alias-global-hook, but
    identifiers introduced by macros must still be replaced by their
    "##sys#macro-alias", which is correctly returned when looking up
    the identifier in the environment, but not used.
    
    Signed-off-by: Peter Bex <peter@more-magic.net>

diff --git a/NEWS b/NEWS
index 55b4cad1..32650079 100644
--- a/NEWS
+++ b/NEWS
@@ -55,6 +55,10 @@
     (short: -l) to specify local directories where to get egg sources
     from.
 
+- Syntax expander
+  - When passing a module as an environment to eval, correctly resolve
+    identifiers in macro expansions (#1295 reported by Caolan McMahon).
+
 - Compiler
   - When emitting types files, the output list is now sorted, to ensure
     deterministic build output (fixes #1783, reported by "ss2").
diff --git a/eval.scm b/eval.scm
index 4562a506..68fba6ff 100644
--- a/eval.scm
+++ b/eval.scm
@@ -145,8 +145,9 @@
 			(let ((var (cond ((not (symbol? j)) x) ; syntax?
 					 ((assq x (##sys#current-environment)) j)
 					 ((not static)
-					  (##sys#alias-global-hook j #f cntr))
-					 (else #f))))
+                                          (##sys#alias-global-hook j #f cntr))
+                                         ((not (eq? x j)) j) ; has macro-alias
+                                         (else #f))))
 			  (when (and ##sys#unbound-in-eval
 				     (or (not var)
 					 (not (##sys#symbol-has-toplevel-binding? var))))
diff --git a/tests/environment-tests.scm b/tests/environment-tests.scm
index b4143a52..c9d22d46 100644
--- a/tests/environment-tests.scm
+++ b/tests/environment-tests.scm
@@ -1,6 +1,6 @@
 ;;;; environment-tests.scm
 
-(import (chicken load))
+(import (chicken load) (chicken eval))
 
 (load-relative "test.scm")
 
@@ -53,6 +53,16 @@
 (test-equal (eval '(format "~a" 1) format-env) "1")
 (test-error (eval 'baz format-env))
 
+;; #1295
+(module example *
+  (import scheme)
+  (define (add a b) (+ a b))
+  (define-syntax double
+    (syntax-rules ()
+      ((_ x) (add x x)))))
+
+(test-equal (eval '(double 10) (module-environment 'example)) 20)
+
 (test-end)
 
 (test-exit)
Trap