begin ループは、特定の条件が満たされるまで、同じコマンドの実行を繰り返します。そのようなループのことを条件付きループといいます。
表 4-23に条件付きループの実行制御用のコマンドを示します。
表 4-23 begin(条件付き) ループコマンド
次に 2 つの一般的な形式を示します。
begin any commands... flag until |
および
begin any commands... flag while more commands repeat |
上記の両方の場合とも、所定のフラグ値によってループが終了させられるまで、ループ内のコマンドが繰り返し実行されます。ループが終了すると、通常、実行はループを閉じているワード (until または repeat) の後のコマンドに継続されます。
beginuntil の場合は、until がスタックの一番上からフラグを削除してそれを調べます。フラグが false の場合は、実行は beginのすぐ後に引き継がれて、ループが繰り返されます。フラグの trueの場合は、実行はループから抜け出ます。
beginwhilerepeat の場合は、while がスタックの一番上からフラグを削除して調べます。フラグが true の場合は、whileのすぐ後のコマンドが実行されてループが繰り返されます。repeatコマンドは制御を自動的に begin に戻してループを継続させます。while が現れたときにフラグが false であった場合は、実行はただちにループから抜け出し、制御がループを閉じている repeat の後の最初のコマンドに移ります。
これらのループのいずれについても、「true ならば通り過ぎる」と覚えると忘れないでしょう。
次に簡単な例を示します。
ok begin 4000 c@ . key? until (任意のキーが押されるまで繰り返す) 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 ok |
この例では、ループはまずメモリー位置 4000 から 1 バイトを取り出して表示します。次に、key? コマンドが呼び出され、これが、ユーザーがそれまでにどれかのキーを押していれば true をスタックに残し、そうでない場合は false を残します。このフラグはuntil によって「消費」され、その値が false であった場合は、ループが繰り返されます。キーを押せば、次に呼び出されたとき、key? は true を返し、したがってループは終了します。
Forth の多くのバージョンとは異なり、ユーザーインタフェースの場合は、ループや条件付き制御構造を対話的に使用できます。つまり、まず最初に定義を作成する必要がありません。