3

CLOSで一時クラスを作成する標準的な方法はありますか。つまり、すべてのインスタンスが停止した後にGCを実行できるクラスですか?

SBCLでは(setf test (defclass #:foo () ()))、つまり、通常はクラスがGCによって保持される原因となったのはクラスの名前だけであると想定して、インターンされていないシンボルを使用しましたが、そのクラスにSBCLファイナライズ関数をインストールしてから、シンボル値を設定しました。 TEST to NILは、何度実行しても、クラスがGCされないことを示しています(gc :full t)。それが可能かどうか、もしそうなら、どのように可能か疑問に思います。

4

1 に答える 1

3

シンボルであるクラス名がパッケージに組み込まれていなくてもかまいません。FIND-CLASSいくつかの内部レジストリデータ構造を調べることによってクラスを見つけます。Clozure Common Lispは、たとえば通常のハッシュテーブルを使用しますCCL::%FIND-CLASSES%

標準的な方法はありません。CommonLisp標準はメカニズムを提供しません。通常、CLOS実装は、特定のクラスのすべてのサブクラスのリストを提供する必要があります。そのためには、クラスからそのサブクラスへの参照が必要です。これが参照である必要があることは指定されていません。たとえば、CLISPはそれを参照として実装しますが、他のCommonLisp実装はそうではないかもしれません。

ソリューションのスケッチ

  • したがって、ファイナライザーでは、スーパークラスからクラスを削除するためにREMOVE-DIRECT-SUBCLASS(その関数がどのパッケージにあるか、多くの場合パッケージにある)を呼び出す必要があります。CLOS

  • また、を呼び出す必要があります(setf (find-class 'my-class-to-be-removed) nil)

  • また、クラス自体にサブクラスがないこともよくわかります。

したがって、広くサポートされているMOPと実装固有のファイナライザーを使用して何かを構築できる場合があります。

于 2012-09-28T06:06:34.537 に答える