ゴールの実行において, ある外部参照ポインタの指す値が必要になると, 処理系核はそのポインタのgenerate メソッドを呼び出す. generate メソッドの実行により 参照値の読出し処理が行われる.
ジェネレータ X の generate メソッドが呼ばれると, X が指すワーカへ %read(X,Ret) が送られ, X はコンシューマに変わる. Ret は参照値の返信先であり, X がフックしている変数を 指す外部参照ポインタである (図10.10 (1), (2)).
%read(X,Ret) を受信したワーカは, X の 参照先が具体化されていれば 「参照値を運ぶメッセージ (%answer_value )」を直ちに返信して参照値を送る.
参照先が変数
の場合は, 返信先を記録したコンシューマ・オブジェクト
( リプライ・オブジェクトと呼ぶ) を生成し変数にフックする
(図10.10 (3)).
変数が具体化されるとリプライ・オブジェクトの unify メソッドが呼ばれ,
%answer_value が返信される(図10.10 (4)).
参照先がジェネレータ外部参照オブジェクト X' の場合は, X' が指すワーカへ %read(X',Ret) を転送する. 返信先はそのままであり, 最初に %read を送信したワーカへ参照値が直接送られる. 外部参照ポインタがチェインしている (外部参照ポインタの指す先が 外部参照ポインタである) 場合, %read の転送が 具体値を持つワーカに到着するまで繰り返されるが, 参照値の返信は 1回のメッセージ送受信で済む.
%answer_value(Ret,value) を受信すると, 返信先 Ret が指す変数を具体値 value で書換え, 変数にフックしていた中断ゴール (群) は実行を再開し, コンシューマ外部参照オブジェクトは解放する (図10.10 (5)).
以上の処理で、%readメッセージ送信側(読み出し側)の処理は、 ジェネレータ外部参照オブジェクトに対して、 generate メソッドを発行することにより行われる(suspend_goal() runtime/faisus.c)。これは4.2で記述した 一般的な中断処理の枠組みで行われる。 一方、%readメッセージ受信側の処理は、 メッセージの転送処理も含め、 decode_read() (runtime/cntlmsg.c)で行われる。 リプライ・コンシューマ・オブジェクトは、runtime/ge_replyhook.c で定義されている、 class reply_hook により実現されている。また、answer_messageの送信も この関数内で直接行われている。