ここでは、DO-LOOPの仲間を扱います
DO ... +LOOP
確定
ループのインデックスは、1ずつ増えていくと決まっているものではありません。
「1増やす」以外の動かし方をしたいときには、DO ... +LOOPを使います。この場合、+LOOPは、その時点でのトップスタックの値を一つ費消して、その値をインデックス値に加算して先に戻します。ですから、
10 0 DO i 2 +LOOP
のようなコードは、0, 2, 4, 6, 8,の値をスタックに積むでしょう。繰り返すかどうかの判定は、
インデックス値 < 終値 |
ならば |
繰り返す |
インデックス値 >= 終値 |
ならば |
やめる |
であることに再度注意してください。
インデックス値を減らすには、+LOOPにくわせるスタック値をマイナスの値にすればよいだけです。ところがその場合、普通は始値>終値となるはずで、インデックス値は始値から始まるわけですから、上の繰り返し判定基準は使えません(一回で終わる)。そこでこの場合には、上の基準がひっくり返されます。つまり、インデックス値が減らされたときには
インデックス値 < 終値 |
ならば |
やめる |
インデックス値 >= 終値 |
ならば |
繰り返す |
という基準になるわけです。ここで注意したいのは、この場合にはインデックス値と終値が等しい場合にも繰り返される、ことになるという点です。ですから、例えば、
-10 0 DO コード -1 +LOOP
なら、"コード"は11回実行されることになります。インデックス値は、0からひとつずつ減っていって、-10まで、ということです。
なお、インデックスを減少させていく場合、?DOは利用できないようです。必要なら自分自身で始値と終値をチェックするコードを書かなければなりません。
関連項目:
最終更新:2018年12月18日 21:46