~ chicken-core (chicken-5) 7bef21de09d279b0413ca94dbef978665c7a0f1c
commit 7bef21de09d279b0413ca94dbef978665c7a0f1c
Author: Peter Bex <peter.bex@xs4all.nl>
AuthorDate: Wed Oct 31 22:27:01 2012 +0100
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Fri Nov 2 10:32:26 2012 +0100
Fix #944 by making the behvior of macro-renamed definitions inside modules similar to the behavior at toplevel; they unhygienically introduce identifiers
Signed-off-by: felix <felix@call-with-current-continuation.org>
diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index 5de86f00..8fd85a30 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -348,7 +348,10 @@
(##sys#er-transformer
(lambda (form r c)
(##sys#check-syntax 'define-values form '(_ #(variable 0) _))
- (for-each (cut ##sys#register-export <> (##sys#current-module)) (cadr form))
+ (for-each (lambda (nm)
+ (let ((name (##sys#get nm '##core#macro-alias nm)))
+ (##sys#register-export name (##sys#current-module))))
+ (cadr form))
`(,(r 'set!-values) ,@(cdr form))))))
(##sys#extend-macro-environment
diff --git a/expand.scm b/expand.scm
index 660d1fa5..06227e2d 100644
--- a/expand.scm
+++ b/expand.scm
@@ -981,7 +981,8 @@
(body (cddr form)) )
(cond ((not (pair? head))
(##sys#check-syntax 'define form '(_ symbol . #(_ 0 1)))
- (##sys#register-export head (##sys#current-module))
+ (let ((name (or (getp head '##core#macro-alias) head)))
+ (##sys#register-export name (##sys#current-module)))
(when (c (r 'define) head)
(##sys#defjam-error x))
`(##core#set!
@@ -1005,7 +1006,8 @@
(cond ((not (pair? head))
(##sys#check-syntax 'define-syntax head 'symbol)
(##sys#check-syntax 'define-syntax body '#(_ 1))
- (##sys#register-export head (##sys#current-module))
+ (let ((name (or (getp head '##core#macro-alias) head)))
+ (##sys#register-export name (##sys#current-module)))
(when (c (r 'define-syntax) head)
(##sys#defjam-error form))
`(##core#define-syntax ,head ,(car body)))
diff --git a/tests/syntax-tests.scm b/tests/syntax-tests.scm
index cc5f246c..6da0277a 100644
--- a/tests/syntax-tests.scm
+++ b/tests/syntax-tests.scm
@@ -1054,4 +1054,28 @@ take
(lambda (e r c) '(quote *)))))
(import rename-builtins)
-(assert (eq? '* (strip-syntax-on-*)))
\ No newline at end of file
+(assert (eq? '* (strip-syntax-on-*)))
+
+;; #944: macro-renamed defines mismatch with the names recorded in module
+;; definitions, causing the module to be unresolvable.
+
+(module foo ()
+ (import chicken scheme)
+ (define-syntax bar
+ (syntax-rules ()
+ ((_) (begin (define req 1) (display req) (newline)))))
+ (bar))
+
+;; The fix for the above bug causes the req to be defined at toplevel,
+;; unhygienically. The test below should probably be enabled and this
+;; behavior fixed. R5RS seems to allow the current behavior though (?),
+;; and some Schemes (at least Gauche) behave the same way. I think it's
+;; broken, since it's unhygienic.
+#;(module foo ()
+ (import chicken scheme)
+ (define req 1)
+ (define-syntax bar
+ (syntax-rules ()
+ ((_) (begin (define req 2) (display req) (newline)))))
+ (bar)
+ (assert (eq? req 1)))
\ No newline at end of file
Trap