~ chicken-r7rs (master) 1ef24da8d6add8a524bbf0385b1ee0299f08dd49


commit 1ef24da8d6add8a524bbf0385b1ee0299f08dd49
Author:     Evan Hanson <evhan@foldling.org>
AuthorDate: Mon Jun 9 06:30:37 2014 +0000
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Mon Jun 9 06:30:37 2014 +0000

    Expand library forms in toplevel begins

diff --git a/r7rs-compile-time.scm b/r7rs-compile-time.scm
index 2a3e022..58d4ff7 100644
--- a/r7rs-compile-time.scm
+++ b/r7rs-compile-time.scm
@@ -72,9 +72,16 @@
   (cond (##sys#current-source-filename => pathname-directory)
         (else #f)))
 
+(define (expand/begin e)
+  (match (expand e '())
+    (('##core#begin . rest)
+     (cons '##core#begin
+           (map expand/begin rest)))
+    (e* e*)))
+
 (define (expand-toplevel-r7rs-library-forms exps)
   (parameterize ((##sys#macro-environment (r7rs-library-macro-environment)))
-    (map (cut expand <> '()) exps)))
+    (map expand/begin exps)))
 
 (define (read-forms filename ci?)
   (let ((path (##sys#resolve-include-filename filename #t)))
@@ -213,11 +220,17 @@
 (define r7rs-import-for-syntax
   (import-transformer 'import-for-syntax))
 
+;; NOTE Not really "r7rs" -- just the core begin rewrapped in
+;; a transformer. Used when expanding toplevel library forms.
+(define r7rs-begin
+  (##sys#make-structure 'transformer (macro-handler 'begin)))
+
 (define (r7rs-library-macro-environment)
   (filter (lambda (p)
             (memv (caddr p)
                   (map (cut ##sys#slot <> 1)
-                       (list r7rs-cond-expand
+                       (list r7rs-begin
+                             r7rs-cond-expand
                              r7rs-define-library
                              r7rs-include
                              r7rs-include-ci))))
diff --git a/r7rs-support.scm b/r7rs-support.scm
index abefc0d..feadb9c 100644
--- a/r7rs-support.scm
+++ b/r7rs-support.scm
@@ -6,9 +6,13 @@
 
   (import scheme chicken)
 
+  (define (macro-handler name)
+    (cond ((assq name (##sys#macro-environment)) => caddr)
+          (else #f)))
+
   (define (wrap-er-macro-transformer name handler)
     (er-macro-transformer
-     (let ((orig (caddr (assq name (##sys#macro-environment)))))
+     (let ((orig (macro-handler name)))
        (lambda (x r c)
          (let ((e (##sys#current-environment)))
            (handler x r c (lambda (x*) (orig x* '() e))))))))
Trap