do ループ
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
|