aboutsummaryrefslogtreecommitdiffstats
path: root/require.scm
diff options
context:
space:
mode:
Diffstat (limited to 'require.scm')
-rw-r--r--require.scm280
1 files changed, 152 insertions, 128 deletions
diff --git a/require.scm b/require.scm
index e5d919d..a11cbf5 100644
--- a/require.scm
+++ b/require.scm
@@ -1,5 +1,5 @@
;;;; Implementation of VICINITY and MODULES for Scheme
-;Copyright (C) 1991, 1992, 1993, 1994, 1997 Aubrey Jaffer
+;Copyright (C) 1991, 1992, 1993, 1994, 1997, 2002, 2003 Aubrey Jaffer
;
;Permission to copy this software, to modify it, to redistribute it,
;to distribute modified versions, and to use it for any purpose is
@@ -8,7 +8,7 @@
;1. Any copy made of this software must include this copyright notice
;in full.
;
-;2. I have made no warrantee or representation that the operation of
+;2. I have made no warranty or representation that the operation of
;this software will be error-free, and I am under no obligation to
;provide any services, by way of maintenance, update, or otherwise.
;
@@ -16,21 +16,16 @@
;material, there shall be no use of my name in any advertising,
;promotional, or sales literature without prior written consent in
;each case.
-
-(define *SLIB-VERSION* "2d2")
-
-;;; Standardize msdos -> ms-dos.
-(define software-type
- (cond ((eq? 'msdos (software-type))
- (lambda () 'ms-dos))
- (else software-type)))
-
+;@
+(define *SLIB-VERSION* "3a1")
+;@
(define (user-vicinity)
(case (software-type)
((VMS) "[.]")
(else "")))
-
+;@
(define *load-pathname* #f)
+;@
(define vicinity:suffix?
(let ((suffi
(case (software-type)
@@ -38,18 +33,21 @@
((MACOS THINKC) '(#\:))
((MS-DOS WINDOWS ATARIST OS/2) '(#\\ #\/))
((NOSVE) '(#\: #\.))
- ((UNIX COHERENT) '(#\/))
+ ((UNIX COHERENT PLAN9) '(#\/))
((VMS) '(#\: #\])))))
- (lambda (chr) (memv chr suffi))))
+ (lambda (chr) (and (memv chr suffi) #t))))
+;@
+(define (pathname->vicinity pathname)
+ (let loop ((i (- (string-length pathname) 1)))
+ (cond ((negative? i) "")
+ ((vicinity:suffix? (string-ref pathname i))
+ (substring pathname 0 (+ i 1)))
+ (else (loop (- i 1))))))
(define (program-vicinity)
(if *load-pathname*
- (let loop ((i (- (string-length *load-pathname*) 1)))
- (cond ((negative? i) "")
- ((vicinity:suffix? (string-ref *load-pathname* i))
- (substring *load-pathname* 0 (+ i 1)))
- (else (loop (- i 1)))))
+ (pathname->vicinity *load-pathname*)
(slib:error 'program-vicinity " called; use slib:load to load")))
-
+;@
(define sub-vicinity
(case (software-type)
((VMS) (lambda
@@ -65,10 +63,10 @@
((NOSVE) ".")
((MACOS THINKC) ":")
((MS-DOS WINDOWS ATARIST OS/2) "\\")
- ((UNIX COHERENT AMIGA) "/"))))
+ ((UNIX COHERENT PLAN9 AMIGA) "/"))))
(lambda (vic name)
(string-append vic name *vicinity-suffix*))))))
-
+;@
(define (make-vicinity <pathname>) <pathname>)
(define (slib:pathnameize-load *old-load*)
@@ -76,7 +74,6 @@
(let ((old-load-pathname *load-pathname*))
(set! *load-pathname* <pathname>)
(apply *old-load* (cons <pathname> extra))
- (require:provide <pathname>)
(set! *load-pathname* old-load-pathname))))
(set! slib:load-source
@@ -85,11 +82,11 @@
(slib:pathnameize-load slib:load))
;;;; MODULES
-
+;@
(define *catalog* #f)
-(define *modules* '())
-
-(define (require:version path)
+(define *base-table-implementations* '())
+;@
+(define (slib:version path)
(let ((expr (and (file-exists? path)
(call-with-input-file path (lambda (port) (read port))))))
(and (list? expr) (= 3 (length expr))
@@ -100,7 +97,7 @@
(let* ((apair (assq '*SLIB-VERSION* slibcat))
(req (in-vicinity (library-vicinity)
(string-append "require" (scheme-file-suffix))))
- (reqvers (require:version req)))
+ (reqvers (slib:version req)))
(cond ((not (file-exists? req))
(slib:warn "can't find " req) #f)
((not apair) #f)
@@ -121,6 +118,21 @@
((eof-object? expr)
(apply append lst))))))))
'()))
+;@
+(define (catalog:resolve vicinity catlist)
+ (define (res1 e) (if (string? e) (in-vicinity vicinity e) e))
+ (define (resolve p)
+ (cond ((symbol? (cdr p)) p)
+ ((not (list? p)) (cons (car p) (res1 (cdr p))))
+ ((null? (cddr p)) (cons (car p) (res1 (cadr p))))
+ (else (map res1 p))))
+ (map resolve catlist))
+;@
+(define (catalog:read vicinity cat)
+ (catalog:get #f) ; make sure *catalog* exists
+ (set! *catalog*
+ (append (catalog:resolve vicinity (catalog:try-read vicinity cat))
+ *catalog*)))
(define (catalog:get feature)
(if (not *catalog*)
@@ -139,124 +151,136 @@
(set! *catalog*
(append (catalog:try-read (user-vicinity) "usercat") *catalog*))))
(and feature *catalog* (cdr (or (assq feature *catalog*) '(#f . #f)))))
+;@
+(define (slib:in-catalog? feature)
+ (let ((path (catalog:get feature)))
+ (if (symbol? path) (slib:in-catalog? path) path)))
-(define (require:provided? feature)
- (if (symbol? feature)
- (if (memq feature *features*) #t
- (and *catalog*
- (let ((path (catalog:get feature)))
- (cond ((symbol? path) (require:provided? path))
- ((member (if (pair? path) (cdr path) path) *modules*)
- #t)
- (else #f)))))
- (and (member feature *modules*) #t)))
-
-(define (require:feature->path feature)
- (and (symbol? feature)
- (let ((path (catalog:get feature)))
- (if (symbol? path) (require:feature->path path) path))))
-
-(define (require:require feature)
- (or (require:provided? feature)
- (let ((path (catalog:get feature)))
- (cond ((and (not path) (string? feature) (file-exists? feature))
- (set! path feature)))
- (cond ((not feature) (set! *catalog* #f))
- ((not path)
- (slib:error ";required feature not supported: " feature))
- ((symbol? path) (require:require path) (require:provide feature))
- ((not (pair? path)) ;simple name
- (slib:load path)
- (and (not (eq? 'new-catalog feature)) (require:provide feature)))
- (else ;special loads
- (require:require (car path))
- (apply (case (car path)
- ((macro) macro:load)
- ((syntactic-closures) synclo:load)
- ((syntax-case) syncase:load)
- ((macros-that-work) macwork:load)
- ((macro-by-example) defmacro:load)
- ((defmacro) defmacro:load)
- ((source) slib:load-source)
- ((compiled) slib:load-compiled)
- (else (slib:error "unknown package loader" path)))
- (if (list? path) (cdr path) (list (cdr path))))
- (require:provide feature))))))
-
-(define (require:provide feature)
- (if (symbol? feature)
- (if (not (memq feature *features*))
- (set! *features* (cons feature *features*)))
- (if (not (member feature *modules*))
- (set! *modules* (cons feature *modules*)))))
-
-(require:provide 'vicinity)
+;@
+(define (feature-eval expression provided?)
+ (define (bail expression)
+ (slib:error 'invalid 'feature 'expression expression))
+ (define (feval expression)
+ (cond ((not expression) expression)
+ ((symbol? expression) (provided? expression))
+ ((and (list? expression) (pair? expression))
+ (case (car expression)
+ ((not) (case (length expression)
+ ((2) (not (feval (cadr expression))))
+ (else (bail expression))))
+ ((or) (case (length expression)
+ ((1) #f)
+ ;;((2) (feval (cadr expression)))
+ (else (or (feval (cadr expression))
+ (feval (cons 'or (cddr expression)))))))
+ ((and) (case (length expression)
+ ((1) #t)
+ ;;((2) (feval (cadr expression)))
+ (else (and (feval (cadr expression))
+ (feval (cons 'and (cddr expression)))))))
+ (else (bail expression))))
+ (else (bail expression))))
+ (feval expression))
+;@
+(define (provided? expression)
+ (define feature-list (cons (software-type) *features*))
+ (define (provided? expression)
+ (if (memq expression feature-list) #t
+ (and *catalog*
+ (let ((path (catalog:get expression)))
+ (cond ((symbol? path) (provided? path))
+ (else #f))))))
+ (feature-eval expression provided?))
+;@
+(define (require feature)
+ (cond
+ ((not feature) (set! *catalog* #f))
+ ((slib:provided? feature))
+ (else
+ (let ((path (catalog:get feature)))
+ (cond ((not path)
+ (slib:error 'slib:require 'unsupported 'feature feature))
+ ((symbol? path) (slib:provide feature) (slib:require path))
+ ((string? path) ;simple name
+ (and (not (eq? 'new-catalog feature)) (slib:provide feature))
+ (slib:load path))
+ (else ;dispatched loads
+ (slib:provide feature)
+ (slib:require (car path))
+ (apply (case (car path)
+ ((macro) macro:load)
+ ((syntactic-closures) synclo:load)
+ ((syntax-case) syncase:load)
+ ((macros-that-work) macwork:load)
+ ((macro-by-example) defmacro:load)
+ ((defmacro) defmacro:load)
+ ((source) slib:load-source)
+ ((compiled) slib:load-compiled)
+ ((aggregate)
+ (lambda feature (for-each slib:require feature)))
+ ((spectral-tristimulus-values) load-ciexyz)
+ ((color-names)
+ (lambda (filename)
+ (load-color-dictionary feature filename)))
+ (else (slib:error "unknown package loader" path)))
+ (if (list? path) (cdr path) (list (cdr path))))))))))
+;@
+(define (require-if feature? feature)
+ (if (slib:provided? feature?) (slib:require feature)))
+;@
+(define (provide feature)
+ (if (not (memq feature *features*))
+ (set! *features* (cons feature *features*))))
-(define provide require:provide)
-(define provided? require:provided?)
-(define require require:require)
+;@
+(define slib:provide provide)
+(define slib:provided? provided?)
+(define slib:require require)
+(define slib:require-if require-if)
+;;; Legacy
+(define require:provide provide)
+(define require:provided? provided?)
+(define require:require require)
+(slib:provide 'vicinity)
(if (and (string->number "0.0") (inexact? (string->number "0.0")))
- (require:provide 'inexact))
-(if (rational? (string->number "1/19")) (require:provide 'rational))
-(if (real? (string->number "0.0")) (require:provide 'real))
-(if (complex? (string->number "1+i")) (require:provide 'complex))
+ (slib:provide 'inexact))
+(if (rational? (string->number "1/19")) (slib:provide 'rational))
+(if (real? (string->number "0.0")) (slib:provide 'real))
+(if (complex? (string->number "1+i")) (slib:provide 'complex))
(let ((n (string->number "9999999999999999999999999999999")))
- (if (and n (exact? n)) (require:provide 'bignum)))
+ (if (and n (exact? n)) (slib:provide 'bignum)))
(cond
- ((provided? 'srfi)
- (cond-expand (srfi-0 (provide 'srfi-0)) (else #f))
- (cond-expand (srfi-1 (provide 'srfi-1)) (else #f))
- (cond-expand (srfi-2 (provide 'srfi-2)) (else #f))
- (cond-expand (srfi-3 (provide 'srfi-3)) (else #f))
- (cond-expand (srfi-4 (provide 'srfi-4)) (else #f))
- (cond-expand (srfi-5 (provide 'srfi-5)) (else #f))
- (cond-expand (srfi-6 (provide 'srfi-6)) (else #f))
- (cond-expand (srfi-7 (provide 'srfi-7)) (else #f))
- (cond-expand (srfi-8 (provide 'srfi-8)) (else #f))
- (cond-expand (srfi-9 (provide 'srfi-9)) (else #f))
- (cond-expand (srfi-10 (provide 'srfi-10)) (else #f))
- (cond-expand (srfi-11 (provide 'srfi-11)) (else #f))
- (cond-expand (srfi-12 (provide 'srfi-12)) (else #f))
- (cond-expand (srfi-13 (provide 'srfi-13)) (else #f))
- (cond-expand (srfi-14 (provide 'srfi-14)) (else #f))
- (cond-expand (srfi-15 (provide 'srfi-15)) (else #f))
- (cond-expand (srfi-16 (provide 'srfi-16)) (else #f))
- (cond-expand (srfi-17 (provide 'srfi-17)) (else #f))
- (cond-expand (srfi-18 (provide 'srfi-18)) (else #f))
- (cond-expand (srfi-19 (provide 'srfi-19)) (else #f))
- (cond-expand (srfi-20 (provide 'srfi-20)) (else #f))
- (cond-expand (srfi-21 (provide 'srfi-21)) (else #f))
- (cond-expand (srfi-22 (provide 'srfi-22)) (else #f))
- (cond-expand (srfi-23 (provide 'srfi-23)) (else #f))
- (cond-expand (srfi-24 (provide 'srfi-24)) (else #f))
- (cond-expand (srfi-25 (provide 'srfi-25)) (else #f))
- (cond-expand (srfi-26 (provide 'srfi-26)) (else #f))
- (cond-expand (srfi-27 (provide 'srfi-27)) (else #f))
- (cond-expand (srfi-28 (provide 'srfi-28)) (else #f))
- (cond-expand (srfi-29 (provide 'srfi-29)) (else #f))
- (cond-expand (srfi-30 (provide 'srfi-30)) (else #f))))
+ ((slib:provided? 'srfi)
+ (do ((idx 0 (+ 1 idx))
+ (srfis (symbol->string 'srfi-)))
+ ((> idx 100))
+ (let ((srfi (string->symbol (string-append srfis (number->string idx)))))
+ (if (slib:eval `(cond-expand (,srfi #t) (else #f)))
+ (slib:provide srfi))))))
(define report:print
(lambda args
(for-each (lambda (x) (write x) (display #\ )) args)
(newline)))
+;@
(define slib:report
(let ((slib:report (lambda () (slib:report-version) (slib:report-locations))))
(lambda args
(cond ((null? args) (slib:report))
((not (string? (car args)))
(slib:report-version) (slib:report-locations #t))
- ((require:provided? 'transcript)
+ ((slib:provided? 'transcript)
(transcript-on (car args))
(slib:report)
(transcript-off))
- ((require:provided? 'with-file)
+ ((slib:provided? 'with-file)
(with-output-to-file (car args) slib:report))
(else (slib:report))))))
+;@
(define slib:report-version
(lambda ()
(report:print
@@ -266,13 +290,13 @@
(define slib:report-locations
(let ((features *features*))
(lambda args
+ (define sit (scheme-implementation-type))
+ (define siv (string->symbol (scheme-implementation-version)))
(report:print '(IMPLEMENTATION-VICINITY) 'is (implementation-vicinity))
(report:print '(LIBRARY-VICINITY) 'is (library-vicinity))
(report:print '(SCHEME-FILE-SUFFIX) 'is (scheme-file-suffix))
(cond (*load-pathname*
(report:print '*LOAD-PATHNAME* 'is *load-pathname*)))
- (cond ((not (null? *modules*))
- (report:print 'Loaded '*MODULES* 'are: *modules*)))
(let* ((i (+ -1 5)))
(cond ((eq? (car features) (car *features*)))
(else (report:print 'loaded '*FEATURES* ':) (display slib:tab)))
@@ -280,14 +304,14 @@
(lambda (x)
(cond ((eq? (car features) x)
(if (not (eq? (car features) (car *features*))) (newline))
- (report:print 'Implementation '*FEATURES* ':)
+ (report:print sit siv '*FEATURES* ':)
(display slib:tab) (set! i (+ -1 5)))
((zero? i) (newline) (display slib:tab) (set! i (+ -1 5)))
((not (= (+ -1 5) i)) (display #\ )))
(write x) (set! i (+ -1 i)))
*features*))
(newline)
- (report:print 'Implementation '*CATALOG* ':)
+ (report:print sit siv '*CATALOG* ':)
(catalog:get #f)
(cond ((pair? args)
(for-each (lambda (x) (display slib:tab) (report:print x))
@@ -296,9 +320,9 @@
(display slib:tab) (report:print '...)))
(newline))))
-(let ((sit (scheme-implementation-version)))
- (cond ((zero? (string-length sit)))
- ((or (not (string? sit)) (char=? #\? (string-ref sit 0)))
+(let ((siv (scheme-implementation-version)))
+ (cond ((zero? (string-length siv)))
+ ((or (not (string? siv)) (char=? #\? (string-ref siv 0)))
(newline)
(slib:report-version)
(report:print 'edit (scheme-implementation-type) ".init"