"This is a list of module names that have been loaded into Lisp so far.
It is used by PROVIDE and REQUIRE.")
-(defvar sb!ext::*MODULE-PROVIDER-FUNCTIONS* '(module-provide-contrib)
+(defvar *module-provider-functions* '(module-provide-contrib)
"See function documentation for REQUIRE")
\f
is a designator for a list of pathnames to be loaded if the module
needs to be. If PATHNAMES is not supplied, functions from the list
*MODULE-PROVIDER-FUNCTIONS* are called in order with MODULE-NAME
- as an argument, until one of them returns non-NIL."
+ as an argument, until one of them returns non-NIL. User code is
+ responsible for calling PROVIDE to indicate a successful load of the
+ module."
(let ((saved-modules (copy-list *modules*)))
(unless (member (string module-name) *modules* :test #'string=)
(cond (pathnames
;; ambiguity in standard: should we try all pathnames in the
;; list, or should we stop as soon as one of them calls PROVIDE?
(dolist (ele pathnames t)
- (load ele))
- ;; should we do this? Probably can't hurt, while we're
- ;; taking the above view of "load everything"... though
- ;; maybe having REQUIRE directly call PROVIDE is
- ;; aesthetically suboptimal.
- (provide module-name))
+ (load ele)))
(t
(unless (some (lambda (p) (funcall p module-name))
- sb!ext::*module-provider-functions*)
+ *module-provider-functions*)
(error "Don't know how to load ~A" module-name)))))
(set-difference *modules* saved-modules)))
\f
(defun module-provide-contrib (name)
"Stringify and downcase NAME, then attempt to load the file
$SBCL_HOME/name/name"
- (let ((filesys-name (string-downcase (string name))))
- (load
- (merge-pathnames (make-pathname :directory (list :relative filesys-name)
- :name filesys-name)
- (truename (posix-getenv "SBCL_HOME")))))
- (provide name)
- t)
-
-
+ (let* ((filesys-name (string-downcase (string name)))
+ (unadorned-path
+ (merge-pathnames
+ (make-pathname :directory (list :relative filesys-name)
+ :name filesys-name)
+ (truename (posix-getenv "SBCL_HOME"))))
+ (fasl-path (merge-pathnames
+ (make-pathname :type *fasl-file-type*)
+ unadorned-path))
+ (lisp-path (merge-pathnames (make-pathname :type "lisp")
+ unadorned-path)))
+ ;; KLUDGE: there's a race condition here; the file we probe could
+ ;; be removed by the time we get round to trying to load it.
+ ;; Maybe factor out the logic in the LOAD guesser as to which file
+ ;; was meant, so that we can use it here on open streams instead?
+ (when (or (probe-file unadorned-path)
+ (probe-file fasl-path)
+ (probe-file lisp-path))
+ (load unadorned-path)
+ t)))