retry

http://p22.aaacafe.ne.jp/~qwerty/private/queen/page/0054.html

構造化例外処理のついでで、retry文です。

私は、gotoは他の構文で書けるならば好き好んで使ったりしませんが、わざわざそのためだけのフラグ変数を設けるぐらいであれば問答無用でジャンプさせます。

複数ループ脱出とか、文字コードなんかの順次判定とか。

SJIS:
  for ... if ... (SJISにしては変なコードがある) ... goto UTF8;
  RESULT := (SJISフラグ);
  Exit;
UTF8:
  for ... if ... (UTF8にしては変なコードがある) ... goto UTF16;
  RESULT :=(UTF8フラグ);
  Exit;
UTF16:
  ...

酷いのになるとこんなのも。

case (なんか) of
CASE1: ... ;
CASE2: ... ;
else
  goto SKIP;
end;
(CASEのどれかに引っかかった場合の共通処理)
SKIP:

まあこんなのは下方向ですので、ラベル付きbreakがあればいいんですが。
でも、上方向のgotoが欲しい時もちらほら。
単純にループにするとフラグが必要になってしまう例としてはこんなのが。

LOOP:
  ...
  if (条件) then begin ... ; goto LOOP end;
repeat
  FLAG := (条件);
  if FLAG then begin ... end;
until not FLAG;

もうひとつ、例外処理で失敗を検知した場合のやり直し。

repeat
  try
    ...
    FLAG := FALSE;
  except
    FLAG := (メッセージボックスなどでやり直しますかと問う)
  end;
until not FLAG;

ラベル付きBreakと対になる、上方向の構造化gotoは、必須とは言わないまでもあれば相当ありがたい存在じゃないかなーと。

Eiffelにはretryという構造化例外処理をやり直す命令があります(google:Eiffel rescue retry)ので、パクってみました。無論例外ハンドラでしか使えないのはつまらないので、普段も使える普通の制御文として、です。
内部的には結局構造化例外処理とフラグ変数を使ってますけどね。

Queenでは以下のように書ける予定。

TRY: do
  ...
on HANDLER:
  if (メッセージボックスなどでやり直しますかと問う), do
    retry TRY;
  ;
;

なおさらifをさっさと実装しないと、今のところ無限ループを構成できるだけです--;