Это случается со мной снова и снова: я определяю класс и забываю, что я хотел, чтобы он функционировал, или это, скажем, класс виджета Gtk, поэтому необходимо указать его метакласс. Однако, как только он определен, SBCL не позволяет мне изменить метакласс (даже если экземпляра этого класса нет). Например, оценка
(defclass foo ()
((slot-a)))
а затем добавить метакласс и переоценить:
(defclass foo ()
((slot-a))
(:metaclass gobject:gobject-class))
приводит к ошибке:
Cannot CHANGE-CLASS objects into CLASS metaobjects.
[Condition of type SB-PCL::METAOBJECT-INITIALIZATION-VIOLATION]
See also:
The Art of the Metaobject Protocol, CLASS [:initialization]
К сожалению, у меня нет экземпляра «Искусство протокола метаобъектов», чтобы проверить, что там написано. На данный момент единственный способ, который я мог понять, - это перезапустить lisp, что может быть довольно разрушительным.
Поскольку я достаточно скоро осознаю ошибку, я не возражаю полностью отказаться от определенного класса, удалив его. Вопросы:
- Если я создал экземпляры класса, есть ли способ найти их, чтобы аннулировать их и получить их GCed?
- Как удалить класс? Что-то вроде
fmakunbound
для функций.