~ chicken-core (chicken-5) 0b3a73dcf90dff2f3fd50412d6bef5a9945d648c
commit 0b3a73dcf90dff2f3fd50412d6bef5a9945d648c Author: Evan Hanson <evhan@foldling.org> AuthorDate: Fri Aug 14 21:59:54 2015 +1200 Commit: Peter Bex <peter@more-magic.net> CommitDate: Mon Nov 2 21:29:01 2015 +0100 Process library lists when expanding imports Moves srfi-id and library-id into the "sys" namespace, so they can be used in both eval.scm and modules.scm. Once there's a private runtime module, these should go there. diff --git a/eval.scm b/eval.scm index 03c7171c..3d2742a6 100644 --- a/eval.scm +++ b/eval.scm @@ -1294,6 +1294,24 @@ '() ) (loop1 (cdr ids)) ) ) ) ) ) ) +;; 1 => srfi-1 +(define (##sys#srfi-id n) + (if (fixnum? n) + (##sys#intern-symbol + (##sys#string-append "srfi-" (##sys#number->string n))) + (##sys#syntax-error-hook 'require-extension "invalid SRFI number" n))) + +;; (foo bar baz) => foo.bar.baz +(define (##sys#library-id lib) + (define (library-part->string id) + (cond ((symbol? id) (##sys#symbol->string id)) + ((number? id) (##sys#number->string id)) + ((##sys#error "invalid extension specifier" lib)))) + (do ((lib (cdr lib) (cdr lib)) + (str (library-part->string (car lib)) + (string-append str "." (library-part->string (car lib))))) + ((null? lib) (##sys#intern-symbol str)))) + (define ##sys#do-the-right-thing (let ((vector->list vector->list)) (lambda (id comp? imp? #!optional (add-req void)) @@ -1303,25 +1321,6 @@ ,@(if (and imp? (or (not builtin?) (##sys#current-module))) `((import ,id)) ;XXX make hygienic '()))) - - ;; 1 => "srfi-1" - (define (srfi-id n) - (if (fixnum? n) - (##sys#intern-symbol - (##sys#string-append "srfi-" (##sys#number->string n))) - (##sys#syntax-error-hook 'require-extension "invalid SRFI number" n))) - - ;; (foo bar baz) => "foo.bar.baz" - (define (library-id lib) - (define (library-part->string id) - (cond ((symbol? id) (##sys#symbol->string id)) - ((number? id) (##sys#number->string id)) - ((##sys#error "invalid extension specifier" lib)))) - (do ((lib (cdr lib) (cdr lib)) - (str (library-part->string (car lib)) - (string-append str "." (library-part->string (car lib))))) - ((null? lib) (##sys#intern-symbol str)))) - (define (doit id #!optional (impid id)) (cond ((or (memq id builtin-features) (and comp? (memq id builtin-features/compiled))) @@ -1394,7 +1393,7 @@ (exp `(##core#begin ,@(map (lambda (n) - (let ((rid (srfi-id n))) + (let ((rid (##sys#srfi-id n))) (let-values (((exp f2 _) (doit rid))) (set! f (or f f2)) exp))) @@ -1404,15 +1403,15 @@ (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) + (doit (##sys#srfi-id (cadr id2)) id) (follow (cadr id2))) (doit id2 id)))) ((chicken) (if (memq (cadr id) ##sys#core-chicken-modules) - (doit (cadr id) (library-id id)) - (doit (library-id id)))) + (doit (cadr id) (##sys#library-id id)) + (doit (##sys#library-id id)))) (else - (doit (library-id id))))) + (doit (##sys#library-id id))))) ((symbol? id) (doit id)) (else diff --git a/modules.scm b/modules.scm index d85ef426..9b5cdaf9 100644 --- a/modules.scm +++ b/modules.scm @@ -602,12 +602,9 @@ (values name name vexp sexp iexp))) (define (import-spec spec) (cond ((symbol? spec) (import-name spec)) - ((or (not (list? spec)) (< (length spec) 2)) - (##sys#syntax-error-hook loc "invalid import specification" spec)) + ((null? (cdr spec)) (import-name (car spec))) ; single library component ((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)))))) + (import-name (##sys#srfi-id (cadr spec)))) (else (let ((head (car spec)) (imports (cddr spec))) @@ -686,7 +683,8 @@ (##sys#string-append (tostr pref) (##sys#symbol->string (car imp)))) (cdr imp) ) ) (values name `(,head ,form ,pref) (map ren impv) (map ren imps) impi))) - (else (##sys#syntax-error-hook loc "invalid import specification" spec)))))))) + (else + (import-name (##sys#library-id spec))))))))) (##sys#check-syntax loc x '(_ . #(_ 1))) (let ((cm (##sys#current-module))) (for-eachTrap