確定ループを途中で抜ける

LEAVE

確定ループとはいえ、一定の条件の下では繰り返しを中止して抜け出したいときもあります。そのためには、LEAVEがあります。例えば、
… DO  コード  判定式  IF  LEAVE  THEN  コード1  LOOP  コード2 …
とすれば、判定式の結果が真(非0)であったときには、ループの実行が途中でも繰り返しを中断しループを抜けます。その際には"コード1も実行されません。"LEAVEでループを抜けた後は"LOOP"の後ろの"コード2"から実行します。

UNLOOP EXIT

ループを抜けるだけではなく、このループを含むワードの実行自体から抜けたい場合もあります。つまり、"LOOP"より後に書いたコードも実行しないようにしたい、ということです。この場合には、UNLOOPして、さらにEXITします。例えば、
:  myWord  ( -- )
  1000  0  DO
  コード
  判定式  IF  UNLOOP  EXIT  THEN
  コード2
  LOOP
  コード3
;
のようにすると、判定式が真を返したときには、ループが中止されるだけでなく、"コード2"、"コード3"とも実行されることなく、myWordの実行が終了します。

UNLOOP EXIT 補遺

EXITは、ループに限らず、定義内にそれを含むワードそのものから抜け出すためのワードです。EXITが実行されれば、それ以降のコードは実行されず、直ちに実行が呼び出し側にリターンされることになります。

上のようなDO-LOOP内からワードそのものをEXITする場合に、その前にUNLOOPを呼びださなければならない理由は、DO-LOOPが配備しているループカウンターなどを、きちんと整理して、元に戻しておく必要があるからです。この整理をしないと、万が一、そのEXITされたワードが別の定義内のループの中から呼び出されているときには、その呼び出し側のループカウンターがおかしくなってしまいます。

また、定義内でループが入れ子になっている場合には、抜け出すループの個数だけUNLOOPを呼び出す必要があります。つまり、例えば、二重のDO-LOOPの中からワード自体を脱出する場合には、
: … …  DO …… DO … IF UNLOOP UNLOOP EXIT THEN …… LOOP … LOOP … … ;
のように、EXITの前にUNLOOPを二つ書くことになります。

ただし、抜け出す地点のループの深さ分という意味なので、二重ループであっても、内側のループの外にある箇所から脱出する場合は、UNLOOPは一つになります。
: … …  DO …… DO …… LOOP … IF UNLOOP EXIT THEN … … LOOP … … ;

カウンターインデックスを持たない不定ループ(後述)の場合には、EXITする場合もUNLOOPを呼ぶ必要ありません。というより呼んではいけません。


関連項目:






最終更新:2018年12月19日 07:58