(make-effective-method-function-internal generic-function form
method-alist-p wrappers-p)))
-(defun make-effective-method-function-type (generic-function form
- method-alist-p wrappers-p)
+(defun make-effective-method-fun-type (generic-function
+ form
+ method-alist-p
+ wrappers-p)
(if (and (listp form)
(eq (car form) 'call-method))
(let* ((cm-args (cdr form))
'fast-method-call
'method-call))))
(if (and (consp method) (eq (car method) 'make-method))
- (make-effective-method-function-type
+ (make-effective-method-fun-type
generic-function (cadr method) method-alist-p wrappers-p)
(type-of method)))))
'fast-method-call))
(defun memf-test-converter (form generic-function method-alist-p wrappers-p)
(cond ((and (consp form) (eq (car form) 'call-method))
- (case (make-effective-method-function-type
+ (case (make-effective-method-fun-type
generic-function form method-alist-p wrappers-p)
(fast-method-call
'.fast-call-method.)
((and (consp form) (eq (car form) 'call-method-list))
(case (if (every #'(lambda (form)
(eq 'fast-method-call
- (make-effective-method-function-type
+ (make-effective-method-fun-type
generic-function form
method-alist-p wrappers-p)))
(cdr form))
(cond ((and (consp form) (eq (car form) 'call-method))
(let ((gensym (get-effective-method-gensym)))
(values (make-emf-call metatypes applyp gensym
- (make-effective-method-function-type
+ (make-effective-method-fun-type
generic-function form method-alist-p wrappers-p))
(list gensym))))
((and (consp form) (eq (car form) 'call-method-list))
(let ((gensym (get-effective-method-gensym))
(type (if (every #'(lambda (form)
(eq 'fast-method-call
- (make-effective-method-function-type
+ (make-effective-method-fun-type
generic-function form
method-alist-p wrappers-p)))
(cdr form))
(primary ())
(after ())
(around ()))
- (dolist (m applicable-methods)
- (let ((qualifiers (if (listp m)
- (early-method-qualifiers m)
- (method-qualifiers m))))
- (cond ((member ':before qualifiers) (push m before))
- ((member ':after qualifiers) (push m after))
- ((member ':around qualifiers) (push m around))
- (t
- (push m primary)))))
+ (flet ((lose (method why)
+ (invalid-method-error
+ method
+ "The method ~S ~A.~%~
+ Standard method combination requires all methods to have one~%~
+ of the single qualifiers :AROUND, :BEFORE and :AFTER or to~%~
+ have no qualifier at all."
+ method why)))
+ (dolist (m applicable-methods)
+ (let ((qualifiers (if (listp m)
+ (early-method-qualifiers m)
+ (method-qualifiers m))))
+ (cond
+ ((null qualifiers) (push m primary))
+ ((cdr qualifiers)
+ (lose m "has more than one qualifier"))
+ ((eq (car qualifiers) :around)
+ (push m around))
+ ((eq (car qualifiers) :before)
+ (push m before))
+ ((eq (car qualifiers) :after)
+ (push m after))
+ (t
+ (lose m "has an illegal qualifier"))))))
(setq before (reverse before)
after (reverse after)
primary (reverse primary)
applicable-methods))
(defun invalid-method-error (method format-control &rest format-arguments)
- (error "~@<invalid method error for ~2I_~S ~I~_method: ~2I~_~?~:>"
+ (error "~@<invalid method error for ~2I~_~S ~I~_method: ~2I~_~?~:>"
method
format-control
format-arguments))