CLOS中的瞬态类

时间:2012-09-28 05:54:12

标签: garbage-collection lisp common-lisp clos

是否有任何标准方法可以在CLOS中创建瞬态类;也就是说,在所有实例都死了之后可以进行GC的类?

在SBCL中,我尝试了(setf test (defclass #:foo () ())),即假设它通常只是导致该类被GC保留的类名,而是安装了SBCL终结函数。该类,然后将TEST的符号值设置为NIL,表明该类永远不会GC,无论我运行多少次(gc :full t)。这让我想知道是否可能,如果可能,如何。

1 个答案:

答案 0 :(得分:3)

类名,符号不在包中实现并不重要。 FIND-CLASS将通过查看一些内部注册表数据结构来查找该类。 Clozure Common Lisp使用例如普通哈希表CCL::%FIND-CLASSES%

没有标准的方法。 Common Lisp标准没有提供任何机制。通常,CLOS实现将希望提供某个类的所有子类的列表。为此,它需要从类到其子类的引用。未指定此项应为引用。例如,CLISP将其实现为 weak 引用,其他Common Lisp实现可能不会。

解决方案草图

  • 因此,在终结器中,您需要调用REMOVE-DIRECT-SUBCLASS(在该函数可能的包中,通常在包CLOS中)以从其超类中删除该类。

  • 您还需要致电(setf (find-class 'my-class-to-be-removed) nil)

  • 您最好还看一下该类本身没有子类。

因此,您可以使用广泛支持的MOP和特定于实现的终结器来构建一些东西。