(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
(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)))
;; "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)))))
+ (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)))))