他のプログラミング言語にもよくあるケーススイッチです。与えられた数値の値に応じて分岐します。IF-ELSEの重畳を簡約化するものということができます。その標準的な方法は"CASE ... ENDCASE"構造です。次のような構文になります。:
0 VALUE v1
0 VALUE v2
: CASESWITCH ( n -- )
CASE
0 OF コード0 ENDOF
1 OF コード1 EXIT ENDOF
v1 v2 + OF コード2 ENDOF
13 21 RANGEOF コード13-21 ENDOF
コード3
ENDCASE
コード4
;
基本は、初めにトップスタックにある値がOFの左側の値と比較されて、一致したときには、基準値の直後のOFとENDOFで挟まれたコードが実行されて、その後ENDCASEまで飛んで、そこから実行されるということです。
上の例でいえば、トップスタック値が:
0なら |
"コード0"、"コード4" |
1なら |
"コード1"だけ |
v1+v2なら |
"コード2"、 "コード4" |
13以上21以下の値なら |
コード13-21、コード4 |
それら以外なら |
"コード3"、"コード4" |
という実行になります。
EXITはそれを含むワードの処理から途中で抜け出すワードです。
v1とv2はVALUE変数です。この値は、呼び出されるたびに評価されるので、ランタイムにこれらの変数に別の値を代入すれば、それに応じて条件が変わります。
RANGEOFでは、二つの数値で範囲を指定します。トップスタック値がこの範囲内であれば、それ以降ENDOFまでが実行されます。範囲の境界値は範囲に含まれます。
注意すべきことは、特定した値のどれとも一致しなかった場合のコード3(デフォルトコード)が実行される時点では、初めのトップスタック値は残っているという点です。この値はENDCASEに出会ったところでスタックから落とされます。この性質によってコード3は判定に供されたトップスタック値を利用できるようになっています。ただしその場合には、ENDCASEのところでスタックがアンダーフロー(アイテム不足)にならないように、ダミーのスタックアイテムを一つ残す必要があります。
CASE構造も、"IF-THEN"構造などと同様、ワード定義の中で使います。直接解釈実行することはできません。
関連項目:
最終更新:2018年12月19日 16:32