有没有标准的方法可以在CLOS中创建一个临时类;也就是说,一个在所有实例都死后都可以被GC调用的类?
在sbcl中,我尝试了(setf test (defclass #:foo () ()))
,即使用一个不需要的符号,假设它通常只是导致类被gc保留的类的名称,但在该类上安装一个sbcl finalization函数,然后将test的符号值设置为nil,则表明该类从未被gc保留,不管我跑了多少次这让我怀疑这是否可能,如果可能,怎么可能。
最佳答案
类名(一个符号)不在包中并不重要FIND-CLASS
将通过查看一些内部注册表数据结构来查找类Clozure Common Lisp使用一个普通的哈希表。
没有标准的方法通用的lisp标准没有提供任何机制。通常CLOS实现需要提供一个特定类的所有子类的列表为此,它需要从类到其子类的引用没有指定这应该是弱引用例如,CLISP将其实现为弱引用,其他常见的Lisp实现可能不会。
解决方案示意图:
因此,在终结器中,需要调用CCL::%FIND-CLASSES%
(该函数可能在哪个包中,通常在packageREMOVE-DIRECT-SUBCLASS
中)以从其超类中移除类。
您还需要调用CLOS
。
您还最好看到类本身没有子类。
因此,您可以使用广泛支持的mop和特定于实现的终结器来构建一些东西。
关于garbage-collection - CLOS中的 transient 类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12634330/