X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Fdefclass.lisp;h=09bf800ef4b0dc2ec38cb42aa595cb93709465f6;hb=b171183c7115b865b00662ff346061ecd5291ce4;hp=ddd3f0a0fadae6bd303a909d1718e6511bffed0d;hpb=25422d88edd9bf712206aee5143a4f952981b4d5;p=sbcl.git diff --git a/src/pcl/defclass.lisp b/src/pcl/defclass.lisp index ddd3f0a..09bf800 100644 --- a/src/pcl/defclass.lisp +++ b/src/pcl/defclass.lisp @@ -98,20 +98,20 @@ mclass *the-class-structure-class*)))))) (let ((defclass-form - `(progn - (let ,(mapcar #'cdr *initfunctions-for-this-defclass*) - (%compiler-defclass ',name - ',*readers-for-this-defclass* - ',*writers-for-this-defclass* - ',*slot-names-for-this-defclass*) - (load-defclass ',name - ',metaclass - ',supers - (list ,@canonical-slots) - (list ,@(apply #'append - (when defstruct-p - '(:from-defclass-p t)) - other-initargs))))))) + `(progn + (let ,(mapcar #'cdr *initfunctions-for-this-defclass*) + (%compiler-defclass ',name + ',*readers-for-this-defclass* + ',*writers-for-this-defclass* + ',*slot-names-for-this-defclass*) + (load-defclass ',name + ',metaclass + ',supers + (list ,@canonical-slots) + (list ,@(apply #'append + (when defstruct-p + '(:from-defclass-p t)) + other-initargs))))))) (if defstruct-p (progn ;; FIXME: (YUK!) Why do we do this? Because in order @@ -131,7 +131,8 @@ (and (not (eq name 'structure-object)) *the-class-structure-object*))) (defstruct-form (make-structure-class-defstruct-form - name (class-direct-slots (find-class name)) include))) + name (class-direct-slots (find-class name)) + include))) `(progn (eval-when (:compile-toplevel :load-toplevel :execute) ,defstruct-form) ; really compile the defstruct-form @@ -157,13 +158,14 @@ ,defclass-form))))))))) (defun %compiler-defclass (name readers writers slot-names) - (preinform-compiler-about-class-type name) - (proclaim `(ftype (function (t) t) - ,@readers - ,@(mapcar #'slot-reader-name slot-names) - ,@(mapcar #'slot-boundp-name slot-names))) - (proclaim `(ftype (function (t t) t) - ,@writers ,@(mapcar #'slot-writer-name slot-names)))) + (with-single-package-locked-error (:symbol name "defining ~A as a class") + (preinform-compiler-about-class-type name) + (proclaim `(ftype (function (t) t) + ,@readers + ,@(mapcar #'slot-reader-name slot-names) + ,@(mapcar #'slot-boundp-name slot-names))) + (proclaim `(ftype (function (t t) t) + ,@writers ,@(mapcar #'slot-writer-name slot-names))))) (defun make-initfunction (initform) (cond ((or (eq initform t) @@ -213,7 +215,7 @@ :format-control "~@" :format-arguments (list class-name spec `(,(car spec) :initform ,(cadr spec)))))