~ chicken-r7rs (master) 316b1dd06e4adca3bd4e9e69cae68abad29b3831


commit 316b1dd06e4adca3bd4e9e69cae68abad29b3831
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Wed Jun 5 14:05:48 2013 +0000
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Wed Jun 5 14:05:48 2013 +0000

    Added import

diff --git a/NOTES.org b/NOTES.org
index d2b636f..9c26b49 100644
--- a/NOTES.org
+++ b/NOTES.org
@@ -8,3 +8,8 @@ NOTES
 
 * "export" does not support "(rename ...)" specifier yet.
   - this needs extensions to the core module system.
+
+* "(import SYMBOL)" is currently allowed. Should it not?
+
+* Redefinition of "import" causes "re-importing" warnings.
+  - The warnings could be removed in core, it's usefulness is not completely clear.
diff --git a/r7rs-compile-time.scm b/r7rs-compile-time.scm
index 229a7be..71253b9 100644
--- a/r7rs-compile-time.scm
+++ b/r7rs-compile-time.scm
@@ -54,12 +54,13 @@
 	   (loop more)))
       (else (fail "invalid \"cond-expand\" form")))))
 
-(define (fixup-import/export-spec spec loc)
+(define (fixup-import/export-spec spec loc) ; expects spec to be stripped
   (match spec
     (((and head (or 'only 'except 'rename 'prefix)) name . more)
      (cons* head (fixup-import/export-spec name loc) more))
     ((name ...)
      (parse-library-name name loc))
+    ((? symbol? spec) spec)
     (_ (syntax-error loc "invalid import/export specifier" spec))))
 
 (define (current-source-filename)
diff --git a/r7rs.scm b/r7rs.scm
index 9d731bb..980f23b 100644
--- a/r7rs.scm
+++ b/r7rs.scm
@@ -10,26 +10,22 @@
    (require-library r7rs-compile-time numbers))
   (import-for-syntax r7rs-compile-time matchable)
 
-(use srfi-13)				;XXX get rid of this! (used for "string-downcase"?)
-
 (require-library scheme.base)
 
-(define (read-asserted-ci-symbol port valid-symbols error-message)
-  (let ((sym (##sys#read port ##sys#default-read-info-hook)))
-    (or (and (symbol? sym)
-             (memq (string->symbol (string-downcase (symbol->string sym))) valid-symbols))
-        (##sys#read-error port error-message sym))))
-
 (let ((old-hook ##sys#user-read-hook))
   (set! ##sys#user-read-hook
         (lambda (char port)
+	  (define (fail tok)
+	    (##sys#read-error port "invalid boolean literal syntax" tok))
           (case char
-            ((#\f #\F)
-             (read-asserted-ci-symbol port '(f false) "invalid `false' read syntax")
-             #f)
-            ((#\t #\T)
-             (read-asserted-ci-symbol port '(t true) "invalid `true' read syntax")
-             #t)
+            ((#\f #\F #\t #\T)
+	     (let ((sym (##sys#read port ##sys#default-read-info-hook)))
+	       (if (not (symbol? sym))
+		   (fail sym)
+		   (let ((str (symbol->string sym)))
+		     (cond ((or (string-ci=? "t" str) (string-ci=? "true" str)) #t)
+			   ((or (string-ci=? "f" str) (string-ci=? "false" str)) #f)
+			   (else (fail sym)))))))
             (else (old-hook char port))))))
 
 ;;;
diff --git a/scheme.base-interface.scm b/scheme.base-interface.scm
index 91c0c0b..c395ea0 100644
--- a/scheme.base-interface.scm
+++ b/scheme.base-interface.scm
@@ -72,7 +72,9 @@
   guard
   #|
   if
+  |#
   import
+  #|
   ;; import-for-syntax   XXX should we?
   include include-ci
   input-port-open? output-port-open?
diff --git a/scheme.base.scm b/scheme.base.scm
index 1e03416..8037b83 100644
--- a/scheme.base.scm
+++ b/scheme.base.scm
@@ -9,6 +9,19 @@
 (import-for-syntax r7rs-compile-time)
 
 
+(define-syntax import
+  (er-macro-transformer
+   (lambda (x r c)
+     (##sys#expand-import 
+      (cons (car x)
+	    (map (lambda (spec)
+		   (fixup-import/export-spec (strip-syntax spec) 'import))
+		 (cdr x)))
+      r c
+      ##sys#current-environment ##sys#macro-environment
+      #f #f 'import) ) ) )
+
+
 ;;;
 ;;; 4.2.1. Conditionals
 ;;;
Trap