gauche.mop.instance-pool - インスタンスプール ¶しばしば、あるクラスから作られた全てのインスタンスを 追跡したいことがあります。このモジュールはそのための道具を提供します。
インスタンスプールクラスは、 それ自身、及びそのサブクラスのインスタンスのリストを保持するクラスです。
<instance-pool-mixin>を直接継承したクラスが
インスタンスプールの「根」になります。
そのクラス及び全てのサブクラスのインスタンスがそのプールに加えられます。
アプリケーションは複数の根となるクラスを持てます。 複数のインスタンスプールクラスを継承した場合、そのインスタンスは 両方のインスタンスプールに加えられます。
実際にどのようにプールが管理されるかは、
<instance-pool-meta>メタクラスを継承して
メソッドをオーバーロードすることでカスタマイズできます。
インスタンスプールはグローバルであることに注意してください。 明示的にクリアされない限り、作られた全てのインスタンスが保持されます。
{gauche.mop.instance-pool}
クラスにインスタンスを追跡する機能を付け加えるメタクラスです。
デフォルトでは、このメタクラスから作られるクラス、及びその全ての
サブクラスのインスタンスが追跡されます。
{gauche.mop.instance-pool}
このミックスインクラスを直接継承するクラスは<instnace-pool-meta>の
インスタンスになります。メタクラスを直接指定するかわりに、
このミックスインクラスを継承することで、
プールの「根」にすることができます。
{gauche.mop.instance-pool}
classは<instance-pool-meta>メタクラスのインスタンスで
なければなりません。このジェネリックファンクションは
classの持つインスタンスプール中のインスタンスのリストを
返します。
返されるリストは毎回新たに作られます。
インスタンスの順序は不定です。
{gauche.mop.instance-pool}
classのプール中のインスタンスのうち、
述語predを満たすものをひとつ探して返します。
見つからなければ#fが返ります。
{gauche.mop.instance-pool}
classのプールから、述語predを満たすインスタンスを
全て取り除きます。
{gauche.mop.instance-pool}
classのプール中の全てのインスタンスに対して、
konsを、そのインスタンスと蓄積された値を引数として呼びます。
最初の蓄積された値はknilで、各konsの戻り値が
新たな蓄積された値として次のkonsの呼び出しに渡されます。
これは次のコードと機能的に同じですが、
中間のリストを作らない分効率が良いかもしれません。
また、instance-pool->listと同じように、インスタンスの順序は不定です。
(fold kons knil (instance-pool->list class))