初めての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 だからだ。