コンティニュエーション

コンティニュエーションの作成

コンティニュエーション (continuation) は、パステルステッチのインタープリターが動作するために必要な情報を、パステルステッチのデータとして保存したデータ型である。コンティニュエーションを作成するには continuation ブロックを使用する。continuation ブロックのブロック開始文の main 引数にベクトルを与えると、そのベクトルが示す記憶素子にコンティニュエーションを書き込む。記憶装置にコンティニュエーションが書き込まれた後は、continuation ブロックの内容が引き続き実行され、continuation ブロックの終端に達すると、そのまま次の文を実行する。

コンティニュエーションはパステルステッチのインタープリターの現在の状態を保存したデータ型である。ただし、すべての状態を保存しているわけではない。パステルステッチのインタープリターが保持しているデータのうち、コンティニュエーションに保存される部分を動的環境 (dynamic environment)、そうでない部分を静的環境 (static environment) という。また、コンティニュエーションを作成するとき、現在の状態をまったくそのまま保存するのではなく、動的環境に保存されているプログラムの実行位置を continuation ブロックの終端まで進める。

コンティニュエーションの実行

引数解決の終端要因がコンティニュエーションであるとき、そのコンティニュエーションが実行される。それまで実行されていた動的環境は破棄される。コンティニュエーションが実行されると、continuation ブロックの終端から実行が再開される。

コンティニュエーションを実行するとき、統合演算式に引数があると、それらの引数の値をコンティニュエーション引数で得ることができる。コンティニュエーション引数の寿命はコンテキストに拘束されるため、手続きを抜けるとコンティニュエーション引数の値は失われる。

引数模倣呼び出し

call with continuation arguments 制御式は、現在のコンティニュエーション引数を引数として引数解決を実行する。これを引数模倣呼び出し (argument imitation call) という。call with continuation arguments 制御式に記述されている引数は、引数を上書きするか、または引数に追加される。varb コンティニュエーション引数、または call with continuation arguments 制御式の verb 引数は、引数解決の演算指定子として使われる。call with continuation arguments 制御式の戻り値は、それにより実行される引数解決の戻り値である。

無名ベクトルの保持

無名ベクトルは他の無名ベクトルを保持することができる。また、無名ベクトルは同時に複数の無名ベクトルに保持されることができる。無名ベクトルが他の無名ベクトルを保持しているとき、その関係を解放することができる。

静的環境識別子 (static environment identifier) は静的環境に 1 個だけ存在する無名ベクトルである。また、動的環境識別子 (dynamic environment identifier) は動的環境に 1 個だけ存在する無名ベクトルである。プログラムの実行を開始するとき、動的環境が作成されるとともに、新たな無名ベクトルが作成され、その無名ベクトルが動的環境識別子になる。このとき、動的環境識別子は静的環境識別子に保持される。

静的環境識別子は他の無名ベクトルに保持されなくても解放されない。実行中の動的環境の動的環境識別子は他の無名ベクトルに保持されなくても解放されない。halt 制御構文を実行するか、コンティニュエーションを実行すると、実行中だった動的環境は実行中ではなくなるので、他の無名ベクトルに保持されていなければ動的環境識別子が解放される。これらの無名ベクトルを除いて、静的環境識別子または実行中の動的環境の動的環境識別子に直接的または間接的に保持されていない無名ベクトルは解放される。無名ベクトルが解放されると、記憶装置のうち、その無名ベクトルと垂直でないアドレスに記録されている値はすべて削除される。

continuation ブロックで動的環境が作成されたとき、実行中の動的環境を親動的環境、コンティニュエーションとして保存された動的環境を子動的環境と呼ぶ。このとき、新たな無名ベクトルが作成され、その無名ベクトルが子動的環境の識別子になる。子動的環境の識別子は静的環境識別子に保持される。さらに、親動的環境の識別子が保持している無名ベクトルを、子動的環境の識別子も保持する。

引数解決を開始するとき、コンテキスト識別子は動的環境識別子に保持される。手続きが終了したとき、その手続きのコンテキスト識別子は動的環境識別子から解放されるので、他の無名ベクトルがコンテキスト識別子を保持しなければ、コンテキスト識別子が解放される。

無名ベクトルの保持と解放を行うプリミティブ演算には以下のものがある。

互換性についての注意 hold プリミティブ演算は hold additionally プリミティブ演算のシノニムであるが、将来的には、hold exclusively プリミティブ演算のシノニムに変更される可能性がある。

互換性についての注意 free all プリミティブ演算は廃止されたが、実装によっては引き続き使用できる。

互換性についての注意 過去の言語仕様との互換性のため、get static environment anonymous vector プリミティブ演算と get dynamic environment anonymous vector プリミティブ演算は、それぞれ、get static environment identifier プリミティブ演算および get dynamic environment identifier と同じように動作する。これらは将来の言語仕様で削除される可能性がある。

これらのプリミティブ演算で、上記の条件を満たさない引数を与えた場合の動作は、実装により異なる。

静的環境

静的環境は以下の情報を記憶する。

これらを除く情報は動的環境に記憶される。