do ループ (カウント付きループとも呼ばれます) は、ループの繰り返し回数があらかじめ計算できるときに使用します。do ループは、通常、指定した終了値に達する直前に終了します。
表 4-24 に カウント付きループの実行制御用コマンドを示します。
表 4-24 do (カウント付き) ループコマンド
コマンド |
スタックダイアグラム |
説明 |
---|---|---|
+loop |
( n -- ) |
do...+loop 構造を終了します。ループインデックスに n を加算し、do に戻ります (n < 0 の場合は、インデックスは start から end まで使用されます)。 |
?do |
( end start -- ) |
?do...loop の 0 回またはそれ以上の実行を開始します。インデックスは start から end-1 まで使用されます。end = start の場合はループは実行されません。 |
?leave |
( flag -- ) |
flag がゼロ以外の場合、実行を do...loop から抜けます。 |
do |
( end start -- ) |
do...loop を開始します。インデックスは start から end まで使用されます。 例: 10 0 do i . loop ( 0 1 2...d e f と出力します) |
i |
( -- n ) |
ループインデックスをスタックに残します。 |
j |
( -- n ) |
1 つ外側のループのループインデックスをスタックに残します。 |
leave |
( -- ) |
実行を do...loop から抜けます。 |
loop |
( -- ) |
do...loop を終了します。 |
次の画面で、ループの使用方法をいくつか示します。
ok 10 5 do i . loop 5 6 7 8 9 a b c d e f ok ok 2000 1000 do i . i c@ . cr i c@ ff = if leave then 4 +loop 1000 23 1004 0 1008 fe 100c 0 1010 78 1014 ff ok : scan ( byte -- ) ] 6000 5000 (5000 〜 6000 のメモリー領域を走査して指定のバイト値に一致しないバイトを調べる) ] do dup i c@ <> ( byte error? ) ] if i . then ( byte ) ] loop ] drop ( the original byte was still on the stack, discard it ) ] ; ok 55 scan 5005 5224 5f99 ok 6000 5000 do i i c! loop (メモリー領域にステップパターンを埋め込む) ok ok 500 value testloc ok : test16 ( -- ) 1.0000 0 ( do 0-ffff ) (指定位置に異なる 16 ビット値を書き込む) ] do i testloc w! testloc w@ i <> ( error? ) (さらに位置をチェック) ] if ." Error - wrote " i . ." read " testloc w@ . cr ] leave ( exit after first error found ) (この行は省略可能) ] then ] loop ] ; ok test16 ok 6000 to testloc ok test16 Error - wrote 200 read 300 ok |