~ chicken-core (chicken-5) b355fb179d35a9d6a88117af54ef520b330bc06e
commit b355fb179d35a9d6a88117af54ef520b330bc06e Author: felix <felix@call-with-current-continuation.org> AuthorDate: Wed Sep 29 02:43:40 2010 -0400 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Wed Sep 29 02:43:40 2010 -0400 map gensyms in se back to their original name when stripping (fixes #398), thanks to sjamaan, who also provided a test-case diff --git a/compiler.scm b/compiler.scm index 5ae4664f..32c7fa66 100644 --- a/compiler.scm +++ b/compiler.scm @@ -610,7 +610,7 @@ (let* ((bindings (cadr x)) (vars (unzip1 bindings)) (aliases (map gensym vars)) - (se2 (append (map cons vars aliases) se)) ) + (se2 (##sys#extend-se se vars aliases))) (set-real-names! aliases vars) `(let ,(map (lambda (alias b) @@ -647,7 +647,7 @@ llist (lambda (vars argc rest) (let* ((aliases (map gensym vars)) - (se2 (append (map cons vars aliases) se)) + (se2 (##sys#extend-se se vars aliases)) (body0 (##sys#canonicalize-body obody se2 compiler-syntax-enabled)) (body (walk body0 (append aliases e) se2 #f #f)) @@ -881,7 +881,7 @@ (let* ([vars (cadr x)] [obody (cddr x)] [aliases (map gensym vars)] - (se2 (append (map cons vars aliases) se)) + (se2 (##sys#extend-se se vars aliases)) [body (walk (##sys#canonicalize-body obody se2 compiler-syntax-enabled) diff --git a/eval.scm b/eval.scm index b531547b..98564138 100644 --- a/eval.scm +++ b/eval.scm @@ -392,7 +392,7 @@ [vars (map (lambda (x) (car x)) bindings)] (aliases (map gensym vars)) [e2 (cons aliases e)] - (se2 (append (map cons vars aliases) se)) + (se2 (##sys#extend-se se vars aliases)) [body (##sys#compile-to-closure (##sys#canonicalize-body (cddr x) se2 #f) e2 @@ -465,7 +465,7 @@ llist (lambda (vars argc rest) (let* ((aliases (map gensym vars)) - (se2 (append (map cons vars aliases) se)) + (se2 (##sys#extend-se se vars aliases)) (e2 (cons aliases e)) (body (##sys#compile-to-closure diff --git a/expand.scm b/expand.scm index 0ada41fd..a37d1ce3 100644 --- a/expand.scm +++ b/expand.scm @@ -116,6 +116,12 @@ (define strip-syntax ##sys#strip-syntax) +(define (##sys#extend-se se vars #!optional (aliases (map gensym vars))) + (for-each + (cut ##sys#put! <> '##core#real-name <>) + aliases vars) + (append (map cons vars aliases) se)) + ;;; Macro handling diff --git a/tests/syntax-tests.scm b/tests/syntax-tests.scm index 65242530..49aafcbd 100644 --- a/tests/syntax-tests.scm +++ b/tests/syntax-tests.scm @@ -120,6 +120,51 @@ y))) ) +;; From Al* Petrofsky's "An Advanced Syntax-Rules Primer for the Mildly Insane" +(let ((a 1)) + (letrec-syntax + ((foo (syntax-rules () + ((_ b) + (bar a b)))) + (bar (syntax-rules () + ((_ c d) + (cons c (let ((c 3)) + (list d c 'c))))))) + (let ((a 2)) + (t '(1 2 3 a) (foo a))))) + +;; ER equivalent +(let ((a 1)) + (letrec-syntax + ((foo (er-macro-transformer + (lambda (x r c) + `(,(r 'bar) ,(r 'a) ,(cadr x))))) + (bar (er-macro-transformer + (lambda (x r c) + (let ((c (cadr x)) + (d (caddr x))) + `(,(r 'cons) ,c + (,(r 'let) ((,c 3)) + (,(r 'list) ,d ,c ',c)))))))) + (let ((a 2)) + (t '(1 2 3 a) (foo a))))) + +;; IR equivalent +(let ((a 1)) + (letrec-syntax + ((foo (ir-macro-transformer + (lambda (x i c) + `(bar a ,(cadr x))))) + (bar (ir-macro-transformer + (lambda (x i c) + (let ((c (cadr x)) + (d (caddr x))) + `(cons ,c + (let ((,c 3)) + (list ,d ,c ',c)))))))) + (let ((a 2)) + (t '(1 2 3 a) (foo a))))) + (define-syntax kw (syntax-rules (baz) ((_ baz) "baz")Trap