For Development HEAD DRAFTSearch (procedure/syntax/module):

9.18 gauche.mop.instance-pool - インスタンスプール

Module: gauche.mop.instance-pool

しばしば、あるクラスから作られた全てのインスタンスを 追跡したいことがあります。このモジュールはそのための道具を提供します。

インスタンスプールクラスは、 それ自身、及びそのサブクラスのインスタンスのリストを保持するクラスです。

<instance-pool-mixin>を直接継承したクラスが インスタンスプールの「根」になります。 そのクラス及び全てのサブクラスのインスタンスがそのプールに加えられます。

アプリケーションは複数の根となるクラスを持てます。 複数のインスタンスプールクラスを継承した場合、そのインスタンスは 両方のインスタンスプールに加えられます。

実際にどのようにプールが管理されるかは、 <instance-pool-meta>メタクラスを継承して メソッドをオーバーロードすることでカスタマイズできます。

インスタンスプールはグローバルであることに注意してください。 明示的にクリアされない限り、作られた全てのインスタンスが保持されます。

Class: <instance-pool-meta>

{gauche.mop.instance-pool} クラスにインスタンスを追跡する機能を付け加えるメタクラスです。 デフォルトでは、このメタクラスから作られるクラス、及びその全ての サブクラスのインスタンスが追跡されます。

Class: <instance-pool-mixin>

{gauche.mop.instance-pool} このミックスインクラスを直接継承するクラスは<instnace-pool-meta>の インスタンスになります。メタクラスを直接指定するかわりに、 このミックスインクラスを継承することで、 プールの「根」にすることができます。

Generic Function: instance-pool->list class

{gauche.mop.instance-pool} class<instance-pool-meta>メタクラスのインスタンスで なければなりません。このジェネリックファンクションは classの持つインスタンスプール中のインスタンスのリストを 返します。 返されるリストは毎回新たに作られます。 インスタンスの順序は不定です。

Generic Function: instance-pool-find class pred

{gauche.mop.instance-pool} classのプール中のインスタンスのうち、 述語predを満たすものをひとつ探して返します。 見つからなければ#fが返ります。

Generic Function: instance-pool-remove! class pred

{gauche.mop.instance-pool} classのプールから、述語predを満たすインスタンスを 全て取り除きます。

Generic Function: instance-pool-fold class kons knil

{gauche.mop.instance-pool} classのプール中の全てのインスタンスに対して、 konsを、そのインスタンスと蓄積された値を引数として呼びます。 最初の蓄積された値はknilで、各konsの戻り値が 新たな蓄積された値として次のkonsの呼び出しに渡されます。

これは次のコードと機能的に同じですが、 中間のリストを作らない分効率が良いかもしれません。 また、instance-pool->listと同じように、インスタンスの順序は不定です。

(fold kons knil (instance-pool->list class))
Generic Function: instance-pool-map class proc
Generic Function: instance-pool-for-each class proc

{gauche.mop.instance-pool} procclassのプールの各インスタンスに対して呼びます。 instance-pool-mapは呼び出しの結果をリストにして返します。 instance-pool-for-eachprocの結果は捨てられます。

インスタンスがどういう順番で処理されるかは不定です。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT