X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpcl%2Fdefcombin.lisp;h=c4dc44981d0e36f208ef310bc5b3d4a95f4115f0;hb=d0f65b07a30adc989e36a82ddc0ed54d135d638e;hp=eac8820d7b046ae42234c5bdf79e11b0a27d56ac;hpb=942e45e3bb73fd55786e4a0ab4590324063c0c89;p=sbcl.git diff --git a/src/pcl/defcombin.lisp b/src/pcl/defcombin.lisp index eac8820..c4dc449 100644 --- a/src/pcl/defcombin.lisp +++ b/src/pcl/defcombin.lisp @@ -221,7 +221,7 @@ (defvar *long-method-combination-functions* (make-hash-table :test 'eq)) -(defun load-long-defcombin +(defun load-long-defcombin (type-name doc function args-lambda-list source-location) (let* ((specializers (list (find-class 'generic-function) @@ -324,7 +324,12 @@ (method-group-specifiers declarations real-body) (let (names specializer-caches cond-clauses required-checks order-cleanups) (let ((nspecifiers (length method-group-specifiers))) - (dolist (method-group-specifier method-group-specifiers) + (dolist (method-group-specifier method-group-specifiers + (push `(t (return-from .long-method-combination-function. + `(invalid-method-error , .method. + "~@"))) + cond-clauses)) (multiple-value-bind (name tests description order required) (parse-method-group-specifier method-group-specifier) (declare (ignore description)) @@ -343,7 +348,8 @@ :format-arguments (list ',name)))) required-checks)) (loop (unless (and (constantp order) - (neq order (setq order (eval order)))) + (neq order (setq order + (constant-form-value order)))) (return t))) (push (cond ((eq order :most-specific-first) `(setq ,name (nreverse ,name))) @@ -431,7 +437,7 @@ (let ((intercept-rebindings (let (rebindings) (dolist (arg args-lambda-list (nreverse rebindings)) - (unless (member arg lambda-list-keywords) + (unless (member arg lambda-list-keywords :test #'eq) (typecase arg (symbol (push `(,arg ',arg) rebindings)) (cons