It remains to write tests that exercise the new functionality.
(library-name export-group-library-name)
(exports export-group-exports))
-(define (library-exports library #!optional importing-library-name)
+(define-print-method export-group?
+ (standard-print-method 'export-group
+ (lambda (group)
+ (list (export-group-library-name group)))))
+
+(define (library-exports library #!optional importing-library)
(let ((groups (library-export-groups library)))
- (if (default-object? importing-library-name)
+ (if (or (not importing-library)
+ (default-object? importing-library))
(let ((public
(find (lambda (group)
(not (export-group-library-name group)))
groups)))
(if public
- (export-group-exports (car public))
+ (export-group-exports public)
'()))
(fold (lambda (group exports)
- (let ((export-to (export-group-library-name group)))
+ (let ((export-to (export-group-library-name group))
+ (importing-name (library-name importing-library)))
(if (or (not export-to)
- (library-name=? export-to importing-library-name))
+ (library-name=? export-to importing-name))
(append (export-group-exports group) exports)
exports)))
'()
parsed-export library libraries))
(define (merge-parsed-exports parsed-exports)
- (let ((tag (caar parsed-exports))
- (amap (make-amap (make-equal-comparator) 'alist)))
- (for-each (lambda (parsed-export)
- (amap-update!/default amap
- (cadr parsed-export)
- (lambda (names)
- (lset-union (cddr parsed-export) names))
- '()))
- parsed-exports)
- (map (lambda (p) (cons tag p))
- (amap->alist amap))))
+ (if (pair? parsed-exports)
+ (let ((tag (caar parsed-exports))
+ (amap (make-amap (make-equal-comparator) 'alist)))
+ (for-each (lambda (parsed-export)
+ (amap-update!/default amap
+ (cadr parsed-export)
+ (lambda (names)
+ (lset-union eq?
+ (cddr parsed-export)
+ names))
+ '()))
+ parsed-exports)
+ (map (lambda (p) (cons tag p))
+ (amap->alist amap)))
+ parsed-exports))
\f
(define (check-missing-exports groups names)
(let ((missing
(lset-adjoin eq?
froms
(library-ixport-from export)))
- (if public
+ (if base-names
(append (export-group-exports private)
base-names)
(export-group-exports private))))
(symbol<? (car a) (car b))))))
(define (get-exports library db importing-library)
- (library-exports (registered-library library db)
- (and importing-library (library-name importing-library))))
\ No newline at end of file
+ (library-exports (registered-library library db) importing-library))
\ No newline at end of file
(syntax-library-forms (expand-contents parsed-contents) env)))
(define-automatic-property 'imports-used
- '(imports export-groups free-names bound-names name)
+ '(imports export-groups free-names bound-names)
#f
(lambda (imports groups free-names bound-names)
(let ((imports-to
(and (registered-library? name db)
(library-has? 'environment (registered-library name db)))))
-(define (make-environment-from-imports imports db #!optional sealed?
- importing-library-name)
+(define (make-environment-from-imports imports db importing-library sealed?)
(let ((env
((if sealed?
make-root-top-level-environment
make-top-level-environment)
(delete-duplicates (map library-ixport-to imports) eq?))))
- (add-imports-to-env! imports env db importing-library-name)
+ (add-imports-to-env! imports env db importing-library)
env))
-(define (add-imports-to-env! imports env db #!optional importing-library-name)
+(define (add-imports-to-env! imports env db importing-library)
(let ((grouped
(let ((table (make-strong-eq-hash-table)))
(for-each (lambda (import)
(let-values
(((senv sname)
(library-import-source import db
- importing-library-name)))
+ importing-library)))
(hash-table-update! table (library-ixport-to import)
(lambda (sources) (cons (cons senv sname) sources))
(lambda () '()))))
(environment-define env tname value))))))
other))))
-(define (library-import-source import db importing-library-name)
+(define (library-import-source import db importing-library)
(let ((name (library-ixport-from import))
(library (registered-library (library-ixport-from-library import) db)))
(let ((export
(find (lambda (export)
(eq? name (library-ixport-to export)))
- (library-exports library importing-library-name))))
+ (library-exports library importing-library))))
(if (not export)
(error "Not an exported name:" name))
(values (library-environment library)
(library-ixport-from export)))))
\f
-(define-automatic-property 'imports-environment '(imports db name)
- (lambda (imports db name)
- (declare (ignore name))
+(define-automatic-property 'imports-environment '(imports db library)
+ (lambda (imports db library)
+ (declare (ignore library))
(every (lambda (import)
(environment-available? import db))
imports))
- (lambda (imports db name)
- (make-environment-from-imports imports db #t name)))
+ (lambda (imports db library)
+ (make-environment-from-imports imports db library #t)))
(define (environment . import-sets)
(let ((db (current-library-db)))
(make-environment-from-imports (import-sets->imports import-sets db)
- db)))
+ db #f #t)))
(define (top-level-environment . import-sets)
(let ((db (current-library-db)))
(make-environment-from-imports (import-sets->imports import-sets db)
- db
- #f)))
+ db #f #f)))
(define (scheme-report-environment version)
(if (not (eqv? version 5))
(let ((db (current-library-db)))
(add-imports-to-env! (import-sets->imports import-sets db)
(nearest-repl/environment)
- db)))
+ db
+ #f)))
\f
(define (import-sets->imports import-sets db)
(parsed-imports->imports (map parse-import-set import-sets) db))
(define (make-environment-from-parsed-imports parsed-imports)
(let ((db (current-library-db)))
(make-environment-from-imports (parsed-imports->imports parsed-imports db)
- db)))
+ db #f #t)))
(define (parsed-imports->imports parsed-imports db)
(let ((imports (expand-parsed-imports parsed-imports db)))
(encapsulate list
(list 'define-library
(match-if library-name?)
+
(* (object r7rs-declaration-parser))))))
(define r7rs-declaration-parser
(object-parser
(encapsulate list
(list 'export
- (values 'r7rs-export)
+ (values 'r7rs-export #f)
(* (object r7rs-export-spec-parser))))))
(define r7rs-export-spec-parser
(define (scode-library-export-groups library)
(if (= 2 (scode-library-version library))
- (make-export-group
- #f
- (map list->library-ixport (scode-library-property 'exports library)))
+ (list
+ (make-export-group
+ #f
+ (map list->library-ixport (scode-library-property 'exports library))))
(map list->export-group (scode-library-property 'export-groups library))))
(define (singleton-list? object)
(let ((library (car p))
(exports (cdr p)))
(make-library library
- 'exports (convert-exports exports)
+ 'export-groups
+ (list (make-export-group #f (convert-exports exports)))
'environment system-global-environment)))
standard-libraries))
(define (make-synthetic-library library exports environment)
(register-library! (make-library library
- 'exports exports
+ 'export-groups
+ (list (make-export-group #f exports))
'environment environment)
host-library-db))
(assert-equal (library-parsed-imports library)
`((r7rs-import ,@ex1-imports)))
(assert-equal (library-parsed-exports library)
- `((r7rs-export ,@ex1-exports)))
+ `((r7rs-export #f ,@ex1-exports)))
(assert-equal (library-parsed-contents library)
(append-map convert-content ex1-contents))
(assert-string= (library-filename library)
`((r7rs-import ,@ex1-imports)
(r7rs-import ,@ex2-extra-imports)))
(assert-equal (library-parsed-exports library)
- `((r7rs-export ,@ex1-exports)
- (r7rs-export ,@ex2-extra-exports)))
+ `((r7rs-export #f ,@ex1-exports)
+ (r7rs-export #f ,@ex2-extra-exports)))
(assert-equal (library-parsed-contents library)
(append-map convert-content
(append ex2-extra-contents ex1-contents)))