初めてのscala限定継続
↓この記事を読んでやっと限定継続が理解できた。
http://d.hatena.ne.jp/shomah4a/20110113/1294934879
この理解をもとに初めて書いた限定継続のコード。
import scala.util.continuations._; object Demo { def main(args: Array[String]){ // (1) val result = reset { // (2) val a = shift { ctx: (String=>String) => // (3) ctx("abc"); // (9) return "abc12" } // (4) a = "abc" val b = shift { ctx: (String=>Int) => // (5) a + ctx(a + "def"); // (8) return "abc12" } // (6) b = "abcdef" b.length * 2; // (7) return 12 } // (10) result = "abc12" println(result); } }
scalac -P:continuations:enable continuations.scala
とする。
reset の中に shift を複数置けることを確認したかったが、結論としてはできるようだ。
コメントの中の番号は、実行される順序で、番号の右にその時の変数の値などを示す。
1つ目の shift の ctx の戻り値が String なのは、shift の後のコードの実行結果が String だからで、それは (7) の Int ではなく、2つ目の shift のブロックの戻り値 (8) が String だからだ。2つ目の shift の ctx の戻り値が Int なのは、(7) が Int だからだ。