0.pre7.126:
[sbcl.git] / src / pcl / std-class.lisp
index 37fde27..8d16817 100644 (file)
 (defmethod class-default-initargs ((class slot-class))
   (plist-value class 'default-initargs))
 
-(defmethod class-constructors ((class slot-class))
-  (plist-value class 'constructors))
-
 (defmethod class-slot-cells ((class std-class))
   (plist-value class 'class-slot-cells))
 \f
   (with-slots (direct-methods) specializer
     (or (cdr direct-methods)
        (setf (cdr direct-methods)
-             (gathering1 (collecting-once)
+             (let (collect)
                (dolist (m (car direct-methods))
-                 (gather1 (method-generic-function m))))))))
+                  ;; the old PCL code used COLLECTING-ONCE which used
+                  ;; #'EQ to check for newness
+                 (pushnew (method-generic-function m) collect :test #'eq))
+                (nreverse collect))))))
 \f
 ;;; This hash table is used to store the direct methods and direct generic
 ;;; functions of EQL specializers. Each value in the table is the cons.
     (when entry
       (or (cdr entry)
          (setf (cdr entry)
-               (gathering1 (collecting-once)
+               (let (collect)
                  (dolist (m (car entry))
-                   (gather1 (method-generic-function m)))))))))
+                   (pushnew (method-generic-function m) collect :test #'eq))
+                  (nreverse collect)))))))
 
 (defun map-specializers (function)
-  (map-all-classes #'(lambda (class)
-                      (funcall function (class-eq-specializer class))
-                      (funcall function class)))
-  (maphash #'(lambda (object methods)
-              (declare (ignore methods))
-              (intern-eql-specializer object))
+  (map-all-classes (lambda (class)
+                    (funcall function (class-eq-specializer class))
+                    (funcall function class)))
+  (maphash (lambda (object methods)
+            (declare (ignore methods))
+            (intern-eql-specializer object))
           *eql-specializer-methods*)
-  (maphash #'(lambda (object specl)
-              (declare (ignore object))
-              (funcall function specl))
+  (maphash (lambda (object specl)
+            (declare (ignore object))
+            (funcall function specl))
           *eql-specializer-table*)
   nil)
 
 (defun map-all-generic-functions (function)
   (let ((all-generic-functions (make-hash-table :test 'eq)))
-    (map-specializers #'(lambda (specl)
-                         (dolist (gf (specializer-direct-generic-functions
-                                      specl))
-                           (unless (gethash gf all-generic-functions)
-                             (setf (gethash gf all-generic-functions) t)
-                             (funcall function gf))))))
+    (map-specializers (lambda (specl)
+                       (dolist (gf (specializer-direct-generic-functions
+                                    specl))
+                         (unless (gethash gf all-generic-functions)
+                           (setf (gethash gf all-generic-functions) t)
+                           (funcall function gf))))))
   nil)
 
 (defmethod shared-initialize :after ((specl class-eq-specializer)
       (setq direct-default-initargs
            (plist-value class 'direct-default-initargs)))
   (setf (plist-value class 'class-slot-cells)
-       (gathering1 (collecting)
+       (let (collect)
          (dolist (dslotd direct-slots)
            (when (eq (slot-definition-allocation dslotd) class)
              (let ((initfunction (slot-definition-initfunction dslotd)))
-               (gather1 (cons (slot-definition-name dslotd)
+               (push (cons (slot-definition-name dslotd)
                               (if initfunction
                                   (funcall initfunction)
-                                  +slot-unbound+))))))))
+                                  +slot-unbound+))
+                      collect))))
+          (nreverse collect)))
   (setq predicate-name (if predicate-name-p
                           (setf (slot-value class 'predicate-name)
                                 (car predicate-name))
                                         &rest initargs
                                         &key)
   (map-dependents class
-                 #'(lambda (dependent)
-                     (apply #'update-dependent class dependent initargs))))
+                 (lambda (dependent)
+                   (apply #'update-dependent class dependent initargs))))
 
 (defmethod shared-initialize :after ((slotd standard-slot-definition)
                                     slot-names &key)
   (unless (eq allocation :instance)
     (error "Structure slots must have :INSTANCE allocation.")))
 
-(defun make-structure-class-defstruct-form
-       (name direct-slots include)
+(defun make-structure-class-defstruct-form (name direct-slots include)
   (let* ((conc-name (intern (format nil "~S structure class " name)))
          (constructor (intern (format nil "~A constructor" conc-name)))
          (defstruct `(defstruct (,name
     (if direct-slots-p
        (setf (slot-value class 'direct-slots)
              (setq direct-slots
-                   (mapcar #'(lambda (pl)
-                               (when defstruct-p
-                                 (let* ((slot-name (getf pl :name))
-                                        (acc-name
-                                         (format nil
-                                                 "~S structure class ~A"
-                                                 name slot-name))
-                                        (accessor (intern acc-name)))
-                                   (setq pl (list* :defstruct-accessor-symbol
-                                                   accessor pl))))
-                               (make-direct-slotd class pl))
+                   (mapcar (lambda (pl)
+                             (when defstruct-p
+                               (let* ((slot-name (getf pl :name))
+                                      (acc-name
+                                       (format nil
+                                               "~S structure class ~A"
+                                               name slot-name))
+                                      (accessor (intern acc-name)))
+                                 (setq pl (list* :defstruct-accessor-symbol
+                                                 accessor pl))))
+                             (make-direct-slotd class pl))
                            direct-slots)))
        (setq direct-slots (slot-value class 'direct-slots)))
     (when defstruct-p
         (multiple-value-bind (defstruct-form constructor reader-names writer-names)
             (make-structure-class-defstruct-form name direct-slots include)
           (unless (structure-type-p name) (eval defstruct-form))
-          (mapc #'(lambda (dslotd reader-name writer-name)
-                    (let* ((reader (gdefinition reader-name))
-                           (writer (when (gboundp writer-name)
-                                     (gdefinition writer-name))))
-                      (setf (slot-value dslotd 'internal-reader-function)
-                              reader)
-                      (setf (slot-value dslotd 'internal-writer-function)
-                              writer)))
+          (mapc (lambda (dslotd reader-name writer-name)
+                 (let* ((reader (gdefinition reader-name))
+                        (writer (when (gboundp writer-name)
+                                  (gdefinition writer-name))))
+                   (setf (slot-value dslotd 'internal-reader-function)
+                         reader)
+                   (setf (slot-value dslotd 'internal-writer-function)
+                         writer)))
                 direct-slots reader-names writer-names)
           (setf (slot-value class 'defstruct-form) defstruct-form)
           (setf (slot-value class 'defstruct-constructor) constructor))))
                   (make-wrapper nslots class))
                  ((and (equal nlayout olayout)
                        (not
-                        (iterate ((o (list-elements owrapper-class-slots))
-                                  (n (list-elements nwrapper-class-slots)))
-                                 (unless (eq (car o) (car n)) (return t)))))
+                         (loop for o in owrapper-class-slots
+                               for n in nwrapper-class-slots
+                               do (unless (eq (car o) (car n)) (return t)))))
                   owrapper)
                  (t
-                  ;; This will initialize the new wrapper to have the same
-                  ;; state as the old wrapper. We will then have to change
-                  ;; that. This may seem like wasted work (it is), but the
-                  ;; spec requires that we call make-instances-obsolete.
+                  ;; This will initialize the new wrapper to have the
+                  ;; same state as the old wrapper. We will then have
+                  ;; to change that. This may seem like wasted work
+                  ;; (and it is), but the spec requires that we call
+                  ;; MAKE-INSTANCES-OBSOLETE.
                   (make-instances-obsolete class)
                   (class-wrapper class)))))
 
        (update-pv-table-cache-info class)))))
 
 (defun compute-class-slots (eslotds)
-  (gathering1 (collecting)
+  (let (collect)
     (dolist (eslotd eslotds)
-      (gather1
-       (assoc (slot-definition-name eslotd)
-              (class-slot-cells (slot-definition-allocation eslotd)))))))
+      (push (assoc (slot-definition-name eslotd)
+                   (class-slot-cells (slot-definition-allocation eslotd)))
+            collect))
+    (nreverse collect)))
 
 (defun compute-layout (cpl instance-eslotds)
   (let* ((names
-          (gathering1 (collecting)
+          (let (collect)
             (dolist (eslotd instance-eslotds)
               (when (eq (slot-definition-allocation eslotd) :instance)
-                (gather1 (slot-definition-name eslotd))))))
+                (push (slot-definition-name eslotd) collect)))
+             (nreverse collect)))
         (order ()))
     (labels ((rwalk (tail)
               (when tail
                   (setf (gethash gf gf-table) t))
                 (mapc #'collect-gfs (class-direct-superclasses class))))
        (collect-gfs class)
-       (maphash #'(lambda (gf ignore)
-                    (declare (ignore ignore))
-                    (update-gf-dfun class gf))
+       (maphash (lambda (gf ignore)
+                  (declare (ignore ignore))
+                  (update-gf-dfun class gf))
                 gf-table)))))
 
 (defun update-inits (class inits)
            (if entry
                (push d (cdr entry))
                (push (list name d) name-dslotds-alist))))))
-    (mapcar #'(lambda (direct)
-               (compute-effective-slot-definition class
-                                                  (nreverse (cdr direct))))
+    (mapcar (lambda (direct)
+             (compute-effective-slot-definition class
+                                                (nreverse (cdr direct))))
            name-dslotds-alist)))
 
 (defmethod compute-slots :around ((class std-class))
     eslotds))
 
 (defmethod compute-slots ((class structure-class))
-  (mapcan #'(lambda (superclass)
-             (mapcar #'(lambda (dslotd)
-                         (compute-effective-slot-definition class
-                                                            (list dslotd)))
-                     (class-direct-slots superclass)))
+  (mapcan (lambda (superclass)
+           (mapcar (lambda (dslotd)
+                     (compute-effective-slot-definition class
+                                                        (list dslotd)))
+                   (class-direct-slots superclass)))
          (reverse (slot-value class 'class-precedence-list))))
 
 (defmethod compute-slots :around ((class structure-class))
        ;;  --    --> shared    --
 
        ;; Go through all the old local slots.
-       (iterate ((name (list-elements olayout))
-                 (opos (interval :from 0)))
-         (let ((npos (posq name nlayout)))
-           (if npos
-               (setf (clos-slots-ref nslots npos)
-                     (clos-slots-ref oslots opos))
-               (progn
-                 (push name discarded)
-                 (unless (eq (clos-slots-ref oslots opos) +slot-unbound+)
-                   (setf (getf plist name) (clos-slots-ref oslots opos)))))))
+        (let ((opos 0))
+          (dolist (name olayout)
+            (let ((npos (posq name nlayout)))
+              (if npos
+                  (setf (clos-slots-ref nslots npos)
+                        (clos-slots-ref oslots opos))
+                  (progn
+                    (push name discarded)
+                    (unless (eq (clos-slots-ref oslots opos) +slot-unbound+)
+                      (setf (getf plist name) (clos-slots-ref oslots opos))))))
+            (incf opos)))
 
        ;; Go through all the old shared slots.
-       (iterate ((oclass-slot-and-val (list-elements oclass-slots)))
+        (dolist (oclass-slot-and-val oclass-slots)
          (let ((name (car oclass-slot-and-val))
                (val (cdr oclass-slot-and-val)))
            (let ((npos (posq name nlayout)))
         (old-class-slots (wrapper-class-slots old-wrapper)))
 
     ;; "The values of local slots specified by both the class CTO and
-    ;; CFROM are retained. If such a local slot was unbound, it remains
-    ;; unbound."
-    (iterate ((new-slot (list-elements new-layout))
-             (new-position (interval :from 0)))
-      (let ((old-position (posq new-slot old-layout)))
-       (when old-position
-         (setf (clos-slots-ref new-slots new-position)
-               (clos-slots-ref old-slots old-position)))))
+    ;; CFROM are retained. If such a local slot was unbound, it
+    ;; remains unbound."
+    (let ((new-position 0))
+      (dolist (new-slot new-layout)
+        (let ((old-position (posq new-slot old-layout)))
+          (when old-position
+            (setf (clos-slots-ref new-slots new-position)
+                  (clos-slots-ref old-slots old-position))))))
 
     ;; "The values of slots specified as shared in the class CFROM and
     ;; as local in the class CTO are retained."
-    (iterate ((slot-and-val (list-elements old-class-slots)))
+    (dolist (slot-and-val old-class-slots)
       (let ((position (posq (car slot-and-val) new-layout)))
        (when position
          (setf (clos-slots-ref new-slots position) (cdr slot-and-val)))))