kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Scalaでbreak

なんかタイムラインで

@yamashiro むしろなかったら作れそうな雰囲気ですよ! 知人のScalaエヴァンジェリスト @kmizu に「何でbreakないの?」と聞いたら「邪道だから」といなされた上で「こうやれば実装できる」と言われましたよw

http://twitter.com/_tad_/statuses/4362041207

てな話があったので、ネタの鮮度が冷めないうちにさっと実装してみた。といっても簡単な話で、

  • breakは例外のthrowとして実現
  • breakで脱出するブロックは、call-by-nameパラメタを受け取るblockメソッドとして実現

これだけの話。実装は以下。たった数行。

object Break extends Throwable 
def break = throw Break
def block(x: => Unit) {
  try { x } catch { case e:Break.type => }
}

まあ、例外を使っているということでパフォーマンスが気になる向きがあると思うが、よほどクリティカルなところで無い限りはそれほど心配する必要は無いと思う。