goto, 多重ループからの脱出, TakeWhile
多重ループから抜けるためのgotoはまぁアリかなと思う。昔は意味も無くgotoを嫌っていた時期もありましたが。
まあ入れ子になっているループの場合は言語側でそういう文法が用意されているのが一番綺麗だと思うけど。
Perl や Java には Loop Label というのがあるらしい。
LOOP: for my $y (0 .. 10){ for my $x (0 .. 10){ last LOOP if $y == 5; } }
そういえば LINQ の御利益のひとつに「多重ループから抜けるための goto を葬れる」ってのがあるなぁ,とふと思ったり.
LINQ 世代だと,ループのネストはメソッドチェインや一続きのクエリ式に変換できるのでそもそもネストレベルを変化させる必要なし.んで,深いところにあるループ脱出とは末端に近い TakeWhile のことですよ,と.
クエリ式で書くなら Visual Basic 9 の方が強力ですな.たまには VB も使ってみます.
Sub Main() Dim q = From y In Enumerable.Range(0, 11) _ From x In Enumerable.Range(0, 11) _ Take While y <> 5 _ Select String.Format("({0}, {1})", x, y) For Each item In q Console.WriteLine(item) Next End Sub
まあプログラミングスタイルまで変わっちゃうので,これはこれで受け入れがたいという人もいるでしょうけど.私はクエリ式ラヴなのでこういう書き方ができる Visual Basic 9 が普通に羨ましいですな.
(追記)引用のリンク先が間違っていたのを修正.