【问题标题】:Transient classes in CLOSCLOS 中的瞬态类
【发布时间】:2012-09-20 00:04:51
【问题描述】:

是否有任何标准方法可以在 CLOS 中创建瞬态类;也就是说,一个类在其所有实例都死后可以被 GC 处理?

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

【问题讨论】:

    标签: garbage-collection lisp common-lisp clos


    【解决方案1】:

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

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

    解决方案草图

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

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

    • 你最好看看这个类本身没有子类。

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

    【讨论】:

    • 您当然似乎是对的,没有标准的方法。我什至只是尝试使用(make-instance 'standard-class ...) 实例化一个类,但即使我已经手动删除了我能够找到的所有对它的引用(包括那些你'已经列出)。可惜了。
    • @Dolda2000:我会询问具体的邮件列表——实施者回答问题的地方。他们应该能够提供更多帮助。
    • 是的,我现在已经这样做了。我只是希望有一种方法可以在标准 CLOS 中做到这一点。 :)
    猜你喜欢
    • 2012-02-25
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2019-09-22
    • 2012-09-09
    • 2011-05-02
    相关资源
    最近更新 更多