高速化した
CASE構造があります。構文は次のようになります。:
: CASES2 ( n -- )
CASE[ 0 ]=> コード0
[ 1 ]=> コード1 EXIT
[ 3 ], [ 5 ]=> コード2
[ 7 10 RANGE]=> コード3
DEFAULT=> drop
]CASE
コード4
;
トップスタック値が: |
|
0なら |
コード0、コード4 |
1なら |
コード1 |
3または5なら |
コード2、コード4 |
7から10までの範囲なら |
コード3、コード4 |
それ以外なら |
コード4 |
が実行されます。
],は、値を並列するときの区切りワードです。他方、RANGE]=>は[との間におかれた二つの値を範囲として指定します。範囲で指定した後に、値を並列したいときには、RANGE],というワードもあります。例えば、
...
...[ 20 30 RANGE], [ ... ]=> ...
...
つまり、一般に、コンマ「,」がついたものは、「〜か、または」という意味に対応すると考えるとわかりやすいでしょう。実行されるべきコードの直前は、「=>」がついたものでなければなりません。
CASE[ ... ]CASEでは、もとのトップスタック値は基準値に一致したときには落とされますが、DEFAULT=>に至ったときには残されたままです。しかも、]CASEがスタック値を落とすこともありません。ですから、デフォルトのコードはこの値を使用することができます。後で使うことがないのなら明示的にドロップします。
CASE[ ... ]CASE構造では、基準値をコンパイル時に固定してしまうことによって効率化を図っているため、基準値をランタイムに変更することはできません。変数で基準を指定しておいて後で変数に別の値を与えても、基準値はコンパイル時の値で固定されてしまっているからです。コンパイル時に固定できるのであれば、変数を使うことに問題はありません。
関連項目:
最終更新:2018年12月20日 00:44