Next: , Previous: , Up: Control Structures   [Contents][Index]


6.9.1 Selection

flag
IF
  code
ENDIF

flag がゼロ以外の場合(IF などに関する限り、 任意のビットが設定されたセルは true 扱いです)、 code が実行されます。

flag
IF
  code1
ELSE
  code2
ENDIF

flag が true の場合は code1 が実行され、 それ以外の場合は code2 が実行されます。

ENDIF の代わりに THEN を使用できます。 実際 THEN は標準です、 がしかし、 ENDIF は非常に人気があるものの、 標準ではありません。 私達は ENDIF の使用をお勧めします。 なぜなら、 他の言語を知っている人にとっても混乱が少ないためです(また、 ENDIF に対しては、 これらの人々の Forth に対する否定的な偏見が強化される傾向が見られません)。 なお、 THEN のみを提供するシステムに ENDIF を追加するのは以下のように簡単です:

: ENDIF   POSTPONE then ; immediate

[Webster’s New Encyclopedic Dictionary によると、then (副詞) には以下の意味があります:

... 2b: 順番に次の後に続く ... 3d: 必然的な結果として (if you were there, then you saw them)

Forth の THEN は 2b の意味を持ちますが、 Pascal や他の多くのプログラミング言語の THEN は 3d の意味を持ちます。]

Gforth には ?DUP-IF および ?DUP-0=-IF というワードも用意されているため、 ?dup の使用を避けることができます。これらの代替手段を使用することは、 ?dup を使用するよりも効率的です。 ENDIF?DUP-IF?DUP-0=-IF の標準 Forth での定義は、compat/control.fs で提供されます。

x
CASE
  x1 OF code1 ENDOF
  x2 OF code2 ENDOF
  …
  ( x ) default-code ( x )
ENDCASE ( )

xix に等しいなら、 最初の codei を実行します。 x1xn のいずれも一致しない場合は、 オプションの default-code が実行されます。 オプションのデフォルト・ケースは、 最後の ENDOF の後にコードを記述するだけで追加できます。 スタック頂上にある x を使用することはできますが、 それを消費してはなりません。 値 x は、 この構造によって(一致する OF によって、 または一致する OF がない場合は ENDCASE によって) 消費されます。 例:

: num-name ( n -- c-addr u )
 case
   0 of s" zero " endof
   1 of s" one "  endof
   2 of s" two "  endof
   \ default case:
   s" other number" 
   rot \ get n on top so ENDCASE can drop it
 endcase ;

(非標準の) ?of を使用して、 case を 3 つ以上の選択肢の一般的な選択構造として使用することもできます。 ?Of はフラグを受け取ります。 例:

: sgn ( n1 -- n2 )
    \ sign function
    case
	dup 0< ?of drop -1 endof
	dup 0> ?of drop 1 endof
	dup \ n1=0 -> n2=0; dup an item, to be consumed by ENDCASE
    endcase ;

プログラミング・スタイル・メモ: コードを理解しやすくするには、 選択構造を介したすべての経路で同一の方法でスタックを変更(消費およびプッシュされるスタック項目の数と型)するようにする必要があります。


Next: Simple Loops, Previous: Control Structures, Up: Control Structures   [Contents][Index]