(let ((existing (gethash truename *module-map*)))
(cond ((null existing))
((eq (module-state existing) t)
+ (when (plusp (module-errors existing))
+ (error "Module `~A' contains errors" name))
(return-from build-module existing))
(t
- (error "Module ~A already being imported at ~A"
+ (error "Module `~A' already being imported at ~A"
name (module-state existing))))))
;; Construct the new module.
(progv
(mapcar #'car *module-bindings-alist*)
(module-variables module)
- (unwind-protect (funcall thunk)
- (setf (module-variables module)
- (mapcar (compose #'car #'symbol-value)
- *module-bindings-alist*)))))
+ (handler-bind ((error (lambda (cond)
+ (declare (ignore cond))
+ (incf (slot-value module 'errors))
+ :decline)))
+ (unwind-protect (funcall thunk)
+ (setf (module-variables module)
+ (mapcar (compose #'car #'symbol-value)
+ *module-bindings-alist*))))))
(defun call-with-temporary-module (thunk)
"Invoke THUNK in the context of a temporary module, returning its values.