不定
ループとは、予め繰り返しの枠を決めることなく、条件判定に基づいて処置を決めるループです。
BEGIN ... WHILE ... REPEAT
BEGIN ... WHILE ... REPEATでは、WHILEの前に、トップスタックに判定結果をおきます。それが真であれば、WHILEとREPEATに挟まれた部分のコードを実行します。偽であればREPEATの後ろに飛びます。
細かく言うと、まず、BEGINとWHILEに囲まれた部分のコードを実行します。その後で,WHILEはトップスタックの値を一つ喰って、REPEATまでのコードを実行するかどうかを判定します。実行した場合は、その後に BEGINの直後まで戻って実行を繰り返します。ですから、
BEGIN コード1 (判定値) WHILE コード2 REPEAT コード3
とすると、判定式の真偽にかかわらず"コード1"は必ず一回は実行されます。判定値が真(=非0)であれば、"コード2"が実行され、BEGINの所まで戻り,再び"コード1"から繰り返されます。判定値が偽(=0)であれば、"コード2"を飛ばして、"コード3"が実行されることになります。
BEGIN .. NWHILE ... REPEAT
変異版として、BEGIN ... NWHILE ... REPEATがあります。中間のNWHILEの意味はnot WHILEで、繰り返し判定の真偽基準が逆になります。つまり、判定値が偽のときには繰り返し、真のときにはループを抜けます。
不定ループもまたコンパイルを定めるものであるため、ワード定義の中に埋め込んで使わなければなりません。直接、解釈実行することはできません。
なお、確定ループとは異なり、不定ループではインデックスを表現する"i"を利用することはできません。繰り返し回数を利用したいときには、自分で変数を定義しカウンタとして設定することになります。
なお、ノーマルな判定条件の如何にかかわらず、緊急にループを抜けたい場合もあります。そのためにはEXITを使うことができます。特別な判定の条件に従ってEXITを呼ぶようにコーディングすればよいでしょう。確定ループの場合の"UNLOOP"のような、特別な準備ワードは必要ありません。ただし、これで抜ける場合には、当のループだけではなくて、このループを含むワード全体から抜け出すことになります。
関連項目:
最終更新:2019年06月18日 14:41