非局所制御フロー

引数解決

引数解決は以下の要因により完了します。

読み出し演算の述語と引数を新しい値に置き換えて引数解決を続行することを「引数変換」と呼びます。また、特定の述語と引数の値に対して、引数解決の完了の要因または引数変換の要因を探索する過程を、引数解決の「試行」と呼びます。引数変換には以下の要因があります。

  1. 非局所制御フロー構文 force
  2. 非局所制御フロー構文 suggest
  3. 呼び出し元ルーチンのサブルーチン固有ベクトルへの移行

また、引数解決を完了する、または引数変換を行う要因がすべて無効であるとき、戻り値を真偽値の false にして引数解決を完了します。

これらの要因の優先順位は、順に以下の通りです。

  1. 非局所制御フロー構文 force
  2. 記憶装置の読み出し
  3. サブルーチンの実行
  4. プリミティブ演算の実行
  5. 非局所制御フロー構文 suggest
  6. 呼び出し元ルーチンのサブルーチン固有ベクトルへの移行
  7. 戻り値を真偽値の false にして引数解決を完了する

これらの要因のうち、記憶装置の読み出し、サブルーチン、プリミティブ演算についてはすでに説明しました。この節では他の要因について説明します。

非局所制御フロー構文

非局所制御フロー構文には force と suggest の 2 種類があります。これらは引数解決の要因としての優先順位が異なります。

非局所制御フロー構文は引数 if, evaluate, next, side effect, group をとります。引数 if と evaluate は必須です。引数 evaluate の目的語は読み出し演算である必要があります。引数 next, side effect, group は省略可能です。

要因が同一である非局所制御フロー構文は、プログラムの後方に書かれているものほど優先されます。そのため、要因が同一である非局所制御フロー構文は後方から順に実行されます。

非局所制御フロー構文が実行されると、まず引数 group が計算されます。引数 group を計算する過程では、非局所制御フロー構文は無効です。非局所制御フローのヒエラルキーにより、この非局所制御フロー構文が有効であると判断されれば、引数 if の計算に進みます。そうでなければ、次の非局所制御フロー構文に移動します。

続いて引数 if の値を計算します。引数 if の値が真であれば、引数 side effect、evaluate 引数族、引数 next をこの順に計算します。そうでなければ、次の非局所制御フロー構文に移動します。

引数 side effect、evaluate 引数族、引数 next を計算するとは、具体的には以下のことを意味します。

引数 side effect、evaluate 引数族、引数 next の計算を終えたら、述語の値を引数 evacuate の述語の値に置き換え、引数の値を引数 evacuate の引数の値に置き換えて、引数解決の新たな試行を行います。また、このとき、引数 evacuate に記述されていない引数の値は、今回の試行での値がそのまま引き継がれます。

非局所制御フロー構文の引数 next

非局所制御フロー構文の引数 next は、もし省略されていなければ、述語解決の次回の試行に影響を与えます。

前回の試行で引数 next の値が omit force であれば、今回の試行では、非局所制御フロー構文 force が無効になります。また、前回の試行で引数 next の値が omit force sequentially であれば、今回の試行では、非局所制御フロー構文 force のうち、前回の試行で引数変換の要因となった非局所制御フロー構文よりも後方に記述されているものが無効になります。

前回の試行で引数 next の値が storage, procedure, primitive であれば、今回の試行では、それぞれ記憶装置の読み出し、サブルーチン、プリミティブ演算のみが、有効な要因になります。

非局所制御フローのヒエラルキー

非局所制御フロー構文の引数を計算する過程では、原則として、非局所制御フロー構文は無効です。ただし、プリミティブ演算 hierarchy を使用すると、非局所制御フロー構文の引数を計算する過程で非局所制御フロー構文を有効にすることができます。非局所制御フロー構文の引数を計算する過程で非局所制御フロー構文が有効であるかどうかを判断することを「非局所制御フローのヒエラルキー」と呼びます。

非局所制御フローのヒエラルキーを使用するには、まず、非局所制御フロー構文の引数 group で、非局所制御フロー構文をグループに所属させます。引数 group の値はベクトルである必要があります。引数 group を省略すると、その非局所制御フロー構文はグループ mainmain に所属します。

次に、プリミティブ演算 hierarchy で非局所制御フローのヒエラルキーを指定します。プリミティブ演算 hierarchy は引数 high と low をとります。いずれの引数もベクトルである必要があり、これらの引数は非局所制御フロー構文のグループに対応します。コード hierarchy: high (A) low (B) が記述されているとき、グループ A はグループ B よりも「上位」、グループ B はグループ A よりも「下位」になります。非局所制御フローのヒエラルキーは推移的です。すなわち、グループ A がグループ B よりも上位であり、グループ B がグループ C よりも上位であれば、グループ A はグループ C よりも上位です。非局所制御フローのヒエラルキーが循環しているとき、動作は不定です。

グループ A がグループ B よりも上位であるとき、グループ A の非局所制御フロー構文の引数 if, next, side effect および evaluate 引数族を計算する過程で、グループ B の非局所制御フロー構文が有効になります。引数 group では非局所制御フロー構文は常に無効です。

呼び出し元ルーチンのサブルーチン固有ベクトルへの移行

引数変換の要因のひとつに「呼び出し元ルーチンのサブルーチン固有ベクトルへの移行」があります。この節では、この要因の動作について説明します。

引数解決の過程で、述語の値がベクトルであるとき、これを「述語ベクトル」と呼びます。述語の値がベクトルでないとき、呼び出し元ルーチンのサブルーチン固有ベクトルへの移行は行われません。

呼び出し元ルーチンのサブルーチン固有ベクトルへの移行では、まず、述語ベクトルに対応するルーチンを検索します。これは、サブルーチンを子から親に向かって順に検索して、述語ベクトルとサブルーチンの固有ベクトルが垂直でない最初のサブルーチンのことです。

述語ベクトルに対応するルーチンが発見されたならば、述語ベクトルから、述語ベクトルに対応するルーチンの固有ベクトルと垂直でない成分を除きます。そして、述語ベクトルに対応するルーチンに親が存在すれば、そのベクトルに親の固有ベクトルを加算したものを新しい述語として、引数解決を続行します。

述語ベクトルに対応するルーチンが発見されなかった、または、述語ベクトルに対応するルーチンに親が存在しないならば、この引数解決の要因は無効です。「呼び出し元ルーチンのサブルーチン固有ベクトルへの移行」は引数解決の要因のうちで優先順位が最低なので、この要因が無効ならば、引数解決そのものが終了します。

引数解決に特有の変数

この節では、引数解決の過程で、コンテキスト変数 (記号 # または姓 argument を持つ変数) と仮変数 (記号 $ または姓 tentative argument を持つ変数) がどのような値を持つか説明します。

コンテキスト変数の値は、現在実行しているサブルーチンのコンテキストです。これは、引数解決の過程であっても、そうでなくても同じです。特殊な変数 offset と verb は、それぞれの意味によって値が決まります。それ以外のコンテキスト変数は、サブルーチンを呼び出した読み出し演算の引数の値です。以上のいずれにも当てはまらないコンテキスト変数の値は論理型の false になります。

引数解決の過程で、仮引数 verb は、引数解決の対象になっている読み出し演算の述語の値です。また、仮引数 offset の値は、引数解決を開始するときに作成される無名ベクトルです。この無名ベクトルは、引数解決を完了する要因がサブルーチンであれば、そのサブルーチンの固有ベクトルとして使われます。引数解決を完了する要因がサブルーチンでなければ、その固有ベクトルは解放されます。その他の仮変数の値は、引数解決の対象になっている読み出し演算の引数の値です。以上のいずれにも当てはまらない仮変数の値は論理型の false になります。

演算子に対する非局所制御フロー構文

演算子は有名ベクトル operationmain を述語とする読み出し演算として処理されます。この読み出し演算は引数 operator, left, right を取ります。引数 operator には演算子を特定するための有名ベクトルが与えられます。引数 operator に使用される有名ベクトルは plus, minus, multiply, divide, intersection, set minus, union, convert, equal, less, less or equal, subset, type, not です。これらの有名ベクトルの姓は main です。順に加算、減算、積、商、積集合、差集合、和集合、型変換、等しい、小なり、小なりイコール、部分集合、型、論理否定を意味します。引数 left と right はそれぞれ左辺と右辺です。単項演算子では引数 left または right が省略されます。

述語 operator に対して非局所制御フロー構文を使用することで、これらの演算子の動作を変更することができます。

演算子のうち ∧ と ∨ は制御構文として扱われます。述語 operatopn を持つ読み出し演算ではありません。そのため、これらの演算子に対して非局所制御フロー構文を使用することはできません。