有没有什么标准的方法可以在CLOS中创建一个临时类;也就是说,一个类可以在它的所有实例都死了之后被GC?
在SBCL中,我尝试了(setf test (defclass #:foo () ())),即在假设它通常只是类名的情况下使用一个未被引用的符号,这会导致类被GC保留,但是在该类上安装SBCL finalization函数,然后将TEST的符号值设置为NIL,这表明无论我运行(gc :full t)多少次,该类都不会被GC。这让我想知道这是否可能,如果可能,又是如何实现的。
发布于 2012-09-28 14:06:35
类名,一个符号,没有驻留在包中,这并不重要。FIND-CLASS将通过查看一些内部注册表数据结构来找到该类。例如,Clozure Common Lisp使用一个普通的哈希表CCL::%FIND-CLASSES%。
没有标准的方法。Common Lisp标准没有提供任何机制。通常,CLOS实现会想要提供某个类的所有子类的列表。为此,它需要从一个类到它的子类的引用。没有指定这应该是弱引用。例如,CLISP将其实现为弱引用,而其他Common Lisp实现可能不会。
解决方案的草图
在终结器中,为了从superclasses.
REMOVE-DIRECT-SUBCLASS (该函数可能在哪个包中,通常在包CLOS中)。还需要调用(setf (find-class 'my-class-to-be-removed) nil).
因此,您也许能够使用广泛支持的MOP和特定于实现的终结器来构建一些东西。
https://stackoverflow.com/questions/12634330
复制相似问题