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