OpenBoot 2.x コマンド・リファレンスマニュアル

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