X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Fdefclass.lisp;h=cf7562a5b2c280fdda12f8d95e98ec886272835a;hb=69ef68ba7393e3492c1b4a756d1140f71c2922bc;hp=8dc0529f20e722d7190d3144b83814cc254c3c13;hpb=f4e8bca5eaa6e6db42299fe2f3852fb2e07508c7;p=sbcl.git diff --git a/src/pcl/defclass.lisp b/src/pcl/defclass.lisp index 8dc0529..cf7562a 100644 --- a/src/pcl/defclass.lisp +++ b/src/pcl/defclass.lisp @@ -117,21 +117,21 @@ ,defclass-form)))))))) (defun canonize-defclass-options (class-name options) - (macrolet ((assert-single (option) - `(when ,option - (error "Multiple ~A options in DEFCLASS ~S." - ,(intern (string option) :keyword) - class-name)))) - (let (metaclass - default-initargs - documentation - canonized-options) + (maplist (lambda (sublist) + (let ((option-name (first (pop sublist)))) + (when (member option-name sublist :key #'first) + (error "Multiple ~S options in DEFCLASS ~S." + option-name class-name)))) + options) + (let (metaclass + default-initargs + documentation + canonized-options) (dolist (option options) (unless (listp option) (error "~S is not a legal defclass option." option)) (case (first option) (:metaclass - (assert-single metaclass) (let ((maybe-metaclass (second option))) (unless (and maybe-metaclass (legal-class-name-p maybe-metaclass)) (error "~@" + name ~S in :DEFAULT-INITARGS of ~ + DEFCLASS ~S.~:>" :format-arguments (list key class-name))) (push key arg-names) (push ``(,',key ,,(make-initfunction val) ,',val) initargs)) @@ -154,14 +153,13 @@ (push `(:direct-default-initargs (list ,@(nreverse initargs))) canonized-options))) (:documentation - (assert-single documentation) (unless (stringp (second option)) (error "~S is not a legal :documentation value" (second option))) (setf documentation t) (push `(:documentation ,(second option)) canonized-options)) (otherwise (push `(',(car option) ',(cdr option)) canonized-options)))) - (values (or metaclass 'standard-class) (nreverse canonized-options))))) + (values (or metaclass 'standard-class) (nreverse canonized-options)))) (defun canonize-defclass-slots (class-name slots env) (let (canonized-specs)