解釈モードでの条件構造

Mops/ForthのIF-ELSE-THEN構文は、条件分岐をコンパイルするワードであるため、ワード定義内でしか利用できませんでした。解釈実行モードで条件分岐したいときには、別のワードセットを使います。

具体的には、[IF]-[ELSE]-[THEN]という角括弧付きのものを使います。使い方は通常のIF-THEN構文と同じです。スタック上の値が真(非0)が偽(0)かの条件にしたがって解釈実行するのであって、その分岐をコンパイルするのでない、というのが相違点です。

例えば、
条件値
[IF]
  :  WORD1  はらほろ  ;
[ELSE]
  :  WORD1  ひれはれ  ;
[THEN]
というコードをロードすると、条件値が非0であれば、内容が"はらほろ"のWORD1が定義されますし、条件値が0であれば、内容が"ひれはれ"のWORD1が定義されることになります。条件値は費消されます。

もちろん、ワード定義を違えるだけでなく、解釈実行の流れを変えることもできます。例えば、
値
条件値
[IF]
  5 +
[THEN]
とすれば、条件値の真偽に応じて、スタック値が5増やされたり、そのままだったりという実行分岐が可能です。

なお、括弧付き条件構文には、"NIF"バージョンは無いようです。

"[IF]-[ELSE]-[THEN]"ワードセットは、IMMEDIATEです。つまり、ワードの定義の中に書いても、それをコンパイルするときに直ちに実行されます。この性質を用いて、ワードの定義内容の一部分だけを条件コンパイルすることもできます。ただし、ワード定義のコンパイル中にもデータスタックは利用されているので、条件値をちょうど[IF]の手前でトップスタックに置くには、別項のState切り替えの角括弧"[ ]"を使うなど、ちょっとした工夫が必要です。


関連項目:






最終更新:2018年12月25日 23:25