Экземпляры CLOS не являются замыканиями
Экземпляры CLOS обычно не реализуются как замыкания. Это было бы трудно. Это некоторая структура данных с чем-то вроде вектора для слотов. Подобно структурам Common Lisp. Разница между экземплярами CLOS и структурами усложняет его: экземпляры CLOS могут изменять количество слотов во время выполнения, и можно изменять класс экземпляра CLOS во время выполнения.
Убедитесь, что слоты имеют значение NIL
С некоторыми расширенными CLOS вы можете убедиться, что слоты имеют значение NIL. Обратите внимание, что функции пакета CLOS
в моем примере могут находиться в другом пакете вашего CL.
Эта функция просматривает все слоты экземпляра. Если слот не привязан, ему присваивается значение NIL
.
(defun set-all-unbound-slots (instance &optional (value nil))
(let ((class (class-of instance)))
(clos:finalize-inheritance class)
(loop for slot in (clos:class-slots class)
for name = (clos:slot-definition-name slot)
unless (slot-boundp instance name)
do (setf (slot-value instance name) value))
instance))
Мы создаем класс mixin:
(defclass set-unbound-slots-mixin () ())
Исправление будет запущено после инициализации объекта.
(defmethod initialize-instance :after ((i set-unbound-slots-mixin) &rest initargs)
(set-all-unbound-slots i nil))
Пример:
(defclass c1 (set-unbound-slots-mixin)
((a :initform 'something)
b
c))
CL-USER 1 > (describe (make-instance 'c1))
#<C1 4020092AEB> is a C1
A SOMETHING
B NIL
C NIL
person
Rainer Joswig
schedule
22.06.2014