I was just looking over Scott's bugreports and I am wondering a bit about a snippet in defsystem:
(defmacro defsystem (name &body options) (destructuring-bind (&key (pathname nil pathname-arg-p) (class 'system) defsystem-depends-on &allow-other-keys) options (let ((component-options (remove-keys '(:defsystem-depends-on :class) options))) `(progn ;; system must be registered before we parse the body, otherwise ;; we recur when trying to find an existing system of the same name ;; to reuse options (e.g. pathname) from ,@(loop :for system :in defsystem-depends-on :collect `(load-system ,system)) (let ((s (system-registered-p ',name))) *** (cond ((and s (eq (type-of (cdr s)) ',class)) (setf (car s) (get-universal-time))) (s (change-class (cdr s) ',class)) (t (register-system (quote ,name) (make-instance ',class :name ',name)))) (%set-system-source-file (load-pathname) (cdr (system-registered-p ',name)))) (parse-component-form nil (list* :module (coerce-name ',name) :pathname ,(determine-system-pathname pathname pathname-arg-p) ',component-options))))))
Look at the cond that's starred -- the first and third branches both cause the DEFINED-SYSTEMS entry for NAME to be updated to the current value of GET-UNIVERSAL-TIME. But the *second* branch does not seem to (unless it happens by some complex chain as a side-effect of CHANGE-CLASS).
Can anyone explain why we shouldn't update the DEFINED-SYSTEMS entry in the case where S already exists but of a different type? Or does this happen as a side-effect of CHANGE-CLASS?
Perhaps this is worthy of a comment....
best, r