コンティニュエーション

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

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

コンティニュエーションはパステルステッチのインタープリターの「現在の状態」を保存したデータ型です。ただし、「現在の状態」といっても、すべての状態を保存するわけではありません。パステルステッチのインタープリターが保持しているデータのうち、コンティニュエーションに保存される部分を「動的環境」、そうでない部分を「静的環境」といいます。

また、コンティニュエーションを作成するとき、「現在の状態」をまったくそのまま保存するのではなく、動的環境に保存されているプログラムの実行位置を continuation ブロックの終端まで進めます。

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

読み出し演算の述語部の値がコンティニュエーションであるとき、そのコンティニュエーションが実行されます。それまで実行されていた動的環境は破棄されます。コンティニュエーションが実行されると、continuation ブロックの終端から実行が再開されます。

コンティニュエーションを実行するとき、読み出し演算に引数があると、それらの引数の値をコンティニュエーション変数で得ることができます。サブルーチンを抜けると、コンティニュエーションの引数をコンティニュエーション変数で得ることはできなくなります。

無名ベクトルの保持

プリミティブ演算 gismo を実行したとき、または、サブルーチンの実行を開始したとき、無名ベクトルが作成されます。無名ベクトルを解放せずに多数の無名ベクトルを作成すると、無名ベクトルが枯渇することがあります。

無名ベクトルは他の無名ベクトルに保持されます。他の無名ベクトルに保持されなくなった無名ベクトルは解放されます。無名ベクトルが解放されると、記憶装置のうち、その無名ベクトルを使用しなければ読み書きできない場所に記録されている値はすべて削除されます。無名ベクトルは複数の無名ベクトルに保持されることもできます。

「静的環境固有ベクトル」は静的環境に 1 個だけ存在する無名ベクトルです。静的環境固有ベクトルは他の無名ベクトルに保持されなくても解放されません。また、「動的環境固有ベクトル」は動的環境に 1 個だけ存在する無名ベクトルです。実行中の動的環境の固有ベクトルは他の無名ベクトルに保持されなくても解放されません。制御構文 halt を実行するか、コンティニュエーションを実行すると、実行中だった動的環境は実行中ではなくなります。すると、他の無名ベクトルに保持されていなければ、動的環境の固有ベクトルは解放されます。

プログラムの実行を開始するとき、動的環境が作成されるとともに、新たな無名ベクトルが作成され、その無名ベクトルが動的環境の固有ベクトルになります。このとき、動的環境の固有ベクトルは静的環境の無名ベクトルに保持されます。

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

サブルーチンには「サブルーチン固有ベクトル」という無名ベクトルが存在します。サブルーチンの実行が開始されたとき、サブルーチン固有ベクトルが作成され、動的環境固有ベクトルがサブルーチン固有ベクトルを保持します。サブルーチンの実行が終了したとき、サブルーチン固有ベクトルは動的環境固有ベクトルから解放されます。他の無名ベクトルが同じサブルーチン固有ベクトルを保持していればそのサブルーチン固有ベクトルは解放されませんが、そうでなければサブルーチン固有ベクトルが解放されます。

無名ベクトルに関連するプリミティブ演算には以下のものがあります

これらのプリミティブ演算に共通の仕様として、引数に真偽値の false を与えることは、引数を省略することと同じです。戻り値に言及されていないプリミティブ演算は真偽値の false を返します。引数が不正である場合の動作は未定義です。

静的環境

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

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