(defmethod compute-sod-effective-method
((message sod-message) (class sod-class))
- (let ((direct-methods (mapcan (lambda (super)
- (let ((method
- (find message
- (sod-class-methods super)
- :key #'sod-method-message)))
- (and method (list method))))
+ (let ((direct-methods (mappend (lambda (super)
+ (remove message
+ (sod-class-methods super)
+ :key #'sod-method-message
+ :test-not #'eql))
(sod-class-precedence-list class))))
(make-instance (message-effective-method-class message)
:message message
;; is harmless.
(let* ((supers (sod-class-direct-superclasses class))
(roots (if supers
- (remove-if #'sod-class-direct-superclasses
- (mapcar (lambda (super)
- (sod-class-chain-head super))
- supers))
+ (remove-duplicates
+ (remove-if #'sod-class-direct-superclasses
+ (mappend (lambda (super)
+ (mapcar (lambda (chain)
+ (sod-class-chain-head
+ (car chain)))
+ (sod-class-chains super)))
+ supers)))
(list class))))
(cond ((null roots) (error "Class ~A has no root class!" class))
((cdr roots) (error "Class ~A has multiple root classes ~