这种情况屡屡发生在我身上:我定义一个类,然后忘记把它设置成可调用的,或者它是一个 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,这可能会引起一些中断。
既然我很快意识到了错误,我不介意完全回避这个定义的类,只需将其删除即可。问题:
- 如果我已经创建了该类的实例,是否有办法找到它们以使它们为null并获得GC处理?
- 如何删除该类?类似于对函数使用
fmakunbound
的方式。