Next: resume_goals()の詳細
Up: ゴールの再開: resume_goals()
Previous: ゴールの再開: resume_goals()
Generatorの処理に比較してより複雑であるゴールレコード、consumerに対しての
処理については、概略の解説を以下で行う。
図2.10として挙げた中断構造の説明の図を
図5.2として再掲する。
Figure 5.2:
中断を表現するデータ構造
 |
この図でわかるように、中断構造の内部は、ゴールレコードと
consumerが混在して環状のリスト構造になっている。
この「ゴールの再開」処理では、このリスト構造をたどり、
以下のような処理を行う。
- ゴールを発見したならば、そのゴールを再開する(つまり、実行可能
ゴールスタックにエンキューする)処理を行う
- consumerを発見したならば、そのconsumerのunifyメソッドを
起動する。
ような処理を行う。
このconsumerに対してのunifyメソッドの発行の結果、また再度同種の
構造の作成が必要になるような場合がある。例えば、マージャの処理は、
- 1.
- 入力にCONSがあれば、出力用にCONSを1つ割付け、
入力のCARをそのCONSにコピーし、出力側と単一化する。
- 2.
- マージャオブジェクト自身を入力のCDRにフックしなおす。
という処理が行われる。このような処理は、入力が``ストリーム''で
あるようなconsumerで広く用いられるため、効率良く処理できることが望ましい。
そのため、unifyメソッドの結果(戻り値)により、これまでの中断レコード、
待合せレコードなどを再利用し、すぐにまた中断構造を作成できるような
処理も実装している。
Sekita Daigo
1998-05-18