- (defstruct `(defstruct (,name
- ,@(when include
- `((:include ,(class-name include))))
- (:predicate nil)
- (:conc-name ,conc-name)
- (:constructor ,constructor ())
- (:copier nil))
- ,@(mapcar (lambda (slot)
- `(,(slot-definition-name slot)
- +slot-unbound+))
- direct-slots)))
- (reader-names (mapcar (lambda (slotd)
- (list 'slot-accessor name
- (slot-definition-name slotd)
- 'reader))
- direct-slots))
- (writer-names (mapcar (lambda (slotd)
- (list 'slot-accessor name
- (slot-definition-name slotd)
- 'writer))
- direct-slots))
- (readers-init
- (mapcar (lambda (slotd reader-name)
- (let ((accessor
+ (included-name (class-name include))
+ (included-slots
+ (when include
+ (mapcar #'dsd-name (dd-slots (find-defstruct-description included-name)))))
+ (old-slots nil)
+ (new-slots nil)
+ (reader-names nil)
+ (writer-names nil))
+ (dolist (slotd (reverse direct-slots))
+ (let* ((slot-name (slot-definition-name slotd))
+ (initform (slot-definition-initform slotd))
+ (type (slot-definition-type slotd))
+ (desc `(,slot-name ,initform :type ,type)))
+ (push `(slot-accessor ,name ,slot-name reader)
+ reader-names)
+ (push `(slot-accessor ,name ,slot-name writer)
+ writer-names)
+ (if (member slot-name included-slots :test #'eq)
+ (push desc old-slots)
+ (push desc new-slots))))
+ (let* ((defstruct `(defstruct (,name
+ ,@(when include
+ `((:include ,included-name
+ ,@old-slots)))
+ (:constructor ,constructor ())
+ (:predicate nil)
+ (:conc-name ,conc-name)
+ (:copier nil))
+ ,@new-slots))
+ (readers-init
+ (mapcar (lambda (slotd reader-name)
+ (let ((accessor