[Openmcl-devel] extensible require mechanism
bryan o'connor
bryan-openmcl at lunch.org
Mon Feb 2 22:56:43 PST 2004
following from the discussion of whether to bundle asdf-install
with openmcl -- i did a quick port of sbcl's require facility.
the idea is that require only deals with the case when optional
pathname(s) are passed. if not, then it goes through a list of
provider modules until the module is loaded. if nothing is found,
an error message is given.
i moved the current require algorithm to a module called
#'module-provide-search-path. i also give the example provider
function that asdf could ship with. i imagine that a similar
one would be written for defsystem.
this was a 15 minute port/hack.. so no guarantees.
...bryan
(in-package :ccl)
(defparameter *module-provider-functions* '(module-provide-search-path))
(defun require (module &optional pathnames)
(when (null module) (report-bad-arg module '(not null)))
(let ((saved-modules (copy-list *modules*)))
(unless (member (string module) *modules* :test #'string=)
(cond (pathnames
(unless (listp pathnames) (setf pathnames (list
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)))
(t
(unless (some (lambda (p) (funcall p module))
*module-provider-functions*)
(error "Don't know how to load ~A" module)))))
(set-difference *modules* saved-modules)))
(defun module-provide-search-path (module)
(format *debug-io* "trying module-provide-search-path~%")
(let* ((module-name (string module))
(pathname (find-module-pathnames module-name)))
(when pathname
(if (consp pathname)
(dolist (path pathname) (load path))
(load pathname))
(setq *modules* (adjoin module-name *modules* :test
#'string-equal)))))
;;;
;;; example provider function distributed with asdf.
;;;
(defun module-provide-asdf (module)
(handler-bind ((style-warning #'muffle-warning))
(let ((system (asdf:find-system module nil)))
(when system
(asdf:operate 'asdf:load-op module)
t))))
(pushnew 'module-provide-asdf ccl::*module-provider-functions*)
More information about the Openmcl-devel
mailing list