~ chicken-core (chicken-5) 7f9f4545d8a6519076749a8dedc046e387eb50c5
commit 7f9f4545d8a6519076749a8dedc046e387eb50c5 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Fri Aug 13 04:03:15 2010 -0400 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Fri Aug 13 04:03:15 2010 -0400 import accepts (srfi N) as module name (suggested by Kon Lovett) diff --git a/distribution/manifest b/distribution/manifest index affd61e9..158c4385 100644 --- a/distribution/manifest +++ b/distribution/manifest @@ -137,6 +137,7 @@ tests/reexport-tests.scm tests/ec.scm tests/ec-tests.scm tests/test-chained-modules.scm +tests/import-tests.scm tests/import-library-test1.scm tests/import-library-test2.scm tests/match-test.scm diff --git a/eval.scm b/eval.scm index ff35cfaf..0d8bb4fb 100644 --- a/eval.scm +++ b/eval.scm @@ -1209,6 +1209,11 @@ ,@(if (and imp? (or (not builtin?) (##sys#current-module))) `((import ,id)) ;XXX make hygienic '()))) + (define (srfi-id n) + (if (fixnum? n) + (##sys#intern-symbol + (##sys#string-append "srfi-" (##sys#number->string n))) + (##sys#syntax-error 'require-extension "invalid SRFI number" n))) (define (doit id impid) (cond ((or (memq id builtin-features) (if comp? @@ -1273,21 +1278,19 @@ (exp `(##core#begin ,@(map (lambda (n) - (unless (fixnum? n) - (##sys#syntax-error 'require-extension "invalid SRFI number" n)) - (let ((rid (string->symbol (string-append "srfi-" (number->string n))))) + (let ((rid (srfi-id n))) (let-values (((exp f2) (doit rid rid))) (set! f (or f f2)) exp))) (cdr id))))) (values exp f))) ((rename except only prefix) - (doit - (let follow ((id2 id)) - (if (and (pair? id2) (pair? (cdr id2))) - (follow (cadr id2)) - id2)) - id)) + (let follow ((id2 id)) + (if (and (pair? id2) (pair? (cdr id2))) + (if (and (eq? 'srfi (car id2)) (null? (cddr id2))) ; only allow one number + (doit (srfi-id (cadr id2)) id) + (follow (cadr id2))) + (doit id2 id)))) (else (##sys#error "invalid extension specifier" id) ) ) ) ((symbol? id) (doit id id)) diff --git a/expand.scm b/expand.scm index 3ca63b71..ad6fb9c1 100644 --- a/expand.scm +++ b/expand.scm @@ -838,7 +838,8 @@ (let ((%only (r 'only)) (%rename (r 'rename)) (%except (r 'except)) - (%prefix (r 'prefix))) + (%prefix (r 'prefix)) + (%srfi (r 'srfi))) (define (resolve sym) (or (lookup sym '()) sym)) ;*** empty se? (define (tostr x) @@ -871,12 +872,16 @@ (cond ((symbol? spec) (import-name spec)) ((or (not (list? spec)) (< (length spec) 2)) (syntax-error loc "invalid import specification" spec)) + ((and (c %srfi (car spec)) (fixnum? (cadr spec)) (null? (cddr spec))) ; only one number + (import-name + (##sys#intern-symbol + (##sys#string-append "srfi-" (##sys#number->string (cadr spec)))))) (else (let* ((s (car spec)) (imp (import-spec (cadr spec))) (impv (car imp)) (imps (cdr imp))) - (cond ((c %only (car spec)) + (cond ((c %only s) (##sys#check-syntax loc spec '(_ _ . #(symbol 0))) (let ((ids (map resolve (cddr spec)))) (let loop ((ids ids) (v '()) (s '())) @@ -888,7 +893,7 @@ (lambda (a) (loop (cdr ids) v (cons a s)))) (else (loop (cdr ids) v s)))))) - ((c %except (car spec)) + ((c %except s) (##sys#check-syntax loc spec '(_ _ . #(symbol 0))) (let ((ids (map resolve (cddr spec)))) (let loop ((impv impv) (v '())) @@ -899,7 +904,7 @@ (else (loop (cdr imps) (cons (car imps) s)))))) ((memq (caar impv) ids) (loop (cdr impv) v)) (else (loop (cdr impv) (cons (car impv) v))))))) - ((c %rename (car spec)) + ((c %rename s) (##sys#check-syntax loc spec '(_ _ . #((symbol symbol) 0))) (let loop ((impv impv) (imps imps) (v '()) (s '()) (ids (cddr spec))) (cond ((null? impv) @@ -925,7 +930,7 @@ (else (loop (cdr impv) imps (cons (car impv) v) s ids))))) - ((c %prefix (car spec)) + ((c %prefix s) (##sys#check-syntax loc spec '(_ _ _)) (let ((pref (tostr (caddr spec)))) (define (ren imp) diff --git a/manual/Modules b/manual/Modules index 766bfd3e..510e548c 100644 --- a/manual/Modules +++ b/manual/Modules @@ -105,7 +105,8 @@ compilation unit, if compiled and used outside of a module. Importing a module does not load or link it - this is a separate operation from importing its bindings. -{{IMPORT}} may be a module name, or an ''import specifier''. +{{IMPORT}} may be a module name or an ''import specifier'', where a +module name is either a symbol or a list of the form {{(srfi N)}}. An {{IMPORT}} defines a set of bindings that are to be made visible in the current scope. diff --git a/tests/import-tests.scm b/tests/import-tests.scm new file mode 100644 index 00000000..f6fd9949 --- /dev/null +++ b/tests/import-tests.scm @@ -0,0 +1,23 @@ +;;;; import-tests.scm + + +(require-library (srfi 4)) + +(module m1 () +(import scheme (only srfi-4 u8vector?)) u8vector?) + +(assert + (handle-exceptions ex #t + (eval ' +(module m2 () +(import scheme chicken (only (srfi 4) u8vector?)) +s8vector?)) #f)) + +(module m3 () +(import scheme (rename (srfi 4) (u8vector? u8v?))) +u8v?) + +(module m4 () +(import scheme chicken) +(require-extension (prefix (srfi 4) s4:)) +s4:f32vector) diff --git a/tests/runtests.sh b/tests/runtests.sh index d75607f6..804edb17 100644 --- a/tests/runtests.sh +++ b/tests/runtests.sh @@ -125,6 +125,9 @@ echo "======================================== compiler syntax tests ..." $compile compiler-syntax-tests.scm ./a.out +echo "======================================== import tests ..." +$interpret import-tests.scm + echo "======================================== import library tests ..." rm -f ../foo.import.* foo.import.* $compile import-library-test1.scm -emit-import-library fooTrap