確定ループ1

繰り返し回数を予め設定するループです。Forth流のループの入り口を説明します。

DO ... LOOP

DO ... LOOPはForth規格にあるループです。
10  0  DO  コード  LOOP

とすれば、"コード"を10回繰り返します。つまり、二つのスタック値が必要で、(一つ下の値-トップの値)回数だけ繰り返すということです。初めの値を終値、次の値を始値と仮に呼ぶことにします。これらの値は負の値でもかまいません。これらの数値を指定する意味は、インデックス値が使えることにかかわりますが、これはあとで触れます。

ループはIF-THENと同じように、ワードの定義に中でしか使うことはできません

"DO ... LOOP"の実際の動作を説明しましょう。まず、インデックス値が始値に設定され、終値は保管されて、内容コードが実行されます。LOOPまで来たところでインデックス値が一つ増やされ、最初に戻って、保管しておいた終値と比較します。インデックス値が終値より小さいならば、また内容コードが実行されます(繰り返し)。インデックス値が、終値と等しいかまたはより大きいときには、繰り返さず、次に移ります。

ですから、
11  1  DO  コード  LOOP
は、前と同じように"コード"を10回繰り返しますが、インデックス値は1から10までとなるわけです。

?DO


ところが、手順をよく考えると、終値が始値より小さい値で指定されたときでも最低一回はコードが実行されてしまうことがわかります。これを防ぐには"?DO ... LOOP"が利用できます。これは始値と終値を比較して、終値が始値より小さいときには一回も実行しないで次に移してくれます。

インデックス i


インデックス値は、"i"で表現され、ループ内で自由に使うことができます。例えば、
:  myWord  ( n -- sum )  1  +  0  swap  1  DO  i  +  LOOP  ;

というワードは、1からn(パラメタ)までの整数を足した値を計算します。

ここまでの話からお分かりのように、始値と終値は、インデックス値で制御する枠であって、実行回数そのものを規定するものではありません。しかも、インデックス値は、1ずつ増やしていくしかないわけではありません。2ずつでも、3ずつでも、任意のステップで増やすことができますし、減らしていくこともできます。このあたりから、少し混乱しやすくなります(少なくとも私には)...(^^;)。


関連項目:






最終更新:2018年12月18日 21:41