なんかタイムラインで
@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 => } }
まあ、例外を使っているということでパフォーマンスが気になる向きがあると思うが、よほどクリティカルなところで無い限りはそれほど心配する必要は無いと思う。