next up previous contents index
Next: Generator object Up: ジェネリック・オブジェクトの概略 Previous: Data object

   
Consumer object

Consumer objectについては、マージャを例として説明する(runtime/gmerge.c)

Consumerオブジェクトを記述するに必要なマクロ群は include/klic/gc_macro.hに記述されている。また、マクロの名称は 一般的にはGC_, またはGCDEF_で開始されている。

単一化:
consumer object は文字通り、データ消費者で、他からデータが送ら れてきたら動き出す。 よって、自発的には実行を開始しようとしないので、 consumer object に対しては passive unification は無意味である。よって、active unifyに対応する UNIFYメソッドしか存在ししない。

consumer object は 変数に フックしたゴール列である中断構造中のフック鎖の中に入っている。 通常の KL1 項とフックされた変数の active unify 時に、 鎖をたどっていった 実行時カーネルが consumer object を 見つけた場合に、このメソッドを呼び出す。

引数として、単一化対象の他のデータ、そしてヒープ割付点へのポインタを取 る。例えば、 merger の入力ストリームに vector を 単一化する時の 処理から分かるように、このメソッドの中身は通常かなり複雑なものになる。 メソッド実行の結果としては、成功、中断、GC要求の3種類である。 それぞれの状態に対応する値 [*] を大域変数を通して返す。 active unification には goal の エンキューを行うなど、 ヒープを消費する場合があるので、 メソッド引数として、ヒープ割付点へのポインタを持ち、 メソッドの返り値として、メソッド実行後の新たな ヒープ割付点ポインタを返す。

GCDEF_UNIFY()により定義される。ここで利用されている主な マクロ群の解説を行う。

GC_SWITCH_ON_TERM:
単一化対象項の型によりdispatchする。 引数はラベル名称。

GC_TRY_TO_ALLOC:
指定された分のデータをヒープに割りつける。 割付に失敗したらならば、そこでgc_requestに飛ぶ。

GC_UNIFY:
2つの引数の項をその場で単一化する。

GC_KL1_UNIFY:
2つの引数の項を単一化するゴールをエンキューする。 メモリが不足した時などに利用する。

GC_SELF:
オブジェクト自身

GC_RETURN_WITH_HOOK:
再度フックされるべき項を返す。

印字
実行時カーネルのプリントルーチンが consumer object を印字する。 次のメソッドを呼ぶ。

print メソッド:
data object のprint メソッドと同様である。

GC:
GCに関しての処理は data object の時と同様である。 Hook関連の処理はkernelがやるため、自オブジェクト、および、 自分が参照している分のコピーだけを行えばよい。

new ルーチン:
new ルーチンに関しても、data object と同様である。



Sekita Daigo
1998-05-18