不定ループ3

BEGIN ... AGAIN



BEGIN ... AGAINは、いわば無限ループです。明示的にループを抜ける回路をつくらない限り、何度でも繰り返します。このループを抜けるには、EXITを用います。
BEGIN  (コード1)  (判定値)  IF  EXIT  THEN  (コード2)  AGAIN
というコードをの場合を説明しましょう。順序としては、(コード1)をまず実行し、(判定値)が真であれば、(コード2)は実行されることなくループを抜けます。偽であれば、(コード2)が実行され、AGAINに至ったところで、BEGINの所まで戻ります。以下、繰り返しです。

既にお気づきの方も多いと思いますが、EXITは、特定のワードの処理全体を抜け出すもので、ループだけを抜けるものではありません。したがって、このループを抜けるときには、定義内にこれを含んでいるワードの処理自体をも抜け出すことになります。このループを抜ける方法はこれしかないのですから、例えば、
:  MyWord  ( -- )
  BEGIN
   コード1
   判定式  IF  EXIT  THEN
  AGAIN
  コード2	 \ これは無意味
;
のようなコードを書いても、コード2は実行される余地はないことになり、無意味となります。このループを抜けたとに何かコードを続けたいときは、このループのAGAINまでを含むワードを書き、それを別のワードから呼び出し、その呼び出しの後に、ループを抜けたあとに続けたいコードを書くことになります。

と、以上が標準規格ですが、MopsではLEAVEが、BEGINループでも機能します。

: MyWord2
 BEGIN
 コード1
  flag1 IF LEAVE THEN
  flag2 IF EXIT THEN
 AGAIN  
 コード2   \ flag1がtrueなら実行される
;
のような場合、flag1が先にtrueになれば、実行はループを抜けて、コード2を実行することになります。flag2だけがtrueになったときは、ループと同時にMyWord2からも抜けるので、コード2は実行されません。

当然ながら、このループもワード定義内に書き込む形でしか利用できません。ループのインデックス値も、必要ならば自分で準備しなければなりません。

なお、細かいことですが、このループはCPUを占拠します。したがって、カーボンイベントなどでflagを立ててこのループを抜けるような場合には、自ら別スレッドを準備して処理をまわすようにするか、時々システムに処理を返してやるかしなければなりません。現状のMopsでは、典型的には、適当な場所にPAUSEを挿入します。このワードはイベントの発生を訊くためのループを呼ぶことによってシステムに処理を返しますが、タイマー(0.2秒に設定されている)によって定期的に処理がこちらに戻ってくるようになっています。


関連項目:






最終更新:2020年01月07日 20:10