~ 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