前 - 上 - 次 - 目次

# Continuation

  [ruby-list:13693] Shin-ichiro Hara <sinara@blade.nagaokaut.ac.jp>さん

  >     callcc { |cont| ... }

  を実行すると、callcc の直前の状態(ローカル変数の値、スタックフレーム) を記憶して contに代入し、... を実行します。cont の指しているこのオブ ジェクトは `Continuation` クラスのインスタンスであり、これに .call(x)す ると x を callcc の返り値として、先に記憶した状態を復元し、callcc の後 に実行が移ります．

  ブロックで、cont.call(x) されずにブロックの実行が終了した場合、その最 終評価値が callcc の返り値になります。

  以下は、`Continuation`による無限ループの例．

  >     def Loop
  >       callcc {|c| $c = c }
  >       yield
  >       $c.call
  >     end

  >     Loop { print "hello\n" }

  `callcc`とは、`call-with-current-continuation`の略です。

  [ruby-list:14085] Inaba Hiroto <inaba@st.rim.or.jp>さん

  >       def foo()
  >         $n = 100; x = 1; foo1(); p "x = #{x}" # １回目
  >         $n = 200; x = 2; foo1(); p "x = #{x}" # ２回目
  >                   x = 3; foo2(); p "x = #{x}"
  >       end
  >       def foo1()
  >         y = $n + 10 # 1回目 110、２回目 210
  >         foo11(); p "y = #{y}"
  >         y = $n + 11 # 1回目 111、２回目 211
  >       end
  >       def foo11()
  >         z = $n + 20                # 1回目 120、２回目 220
  >         p $n==100 ? "callcc true" : "callcc false"
  >         $c = callcc {|c|c} if $n == 100; p "z = #{z}"
  >         z = $n + 21                # 1回目 121、２回目 221
  >       end
  >       def foo2()
  >         p "$c.call " + ($c ? "true" : "false")
  >         $c.call(nil) if $c
  >       end
  >       foo

  >       % ruby -v callcc-toyofuku3.rb
  >       ruby 1.3.3 (1999-04-20) [i686-linux]
  >       "callcc true"
  >       "z = 120"
  >       "y = 110"
  >       "x = 1"
  >       "callcc false"
  >       "z = 220"
  >       "y = 210"
  >       "x = 2"
  >       "$c.call true"
  >       "z = 121"
  >       "y = 111"
  >       "x = 3"
  >       "callcc false"
  >       "z = 220"
  >       "y = 210"
  >       "x = 2"
  >       "$c.call false"
  >       "x = 3"

## スーパークラス:

  `Object`

## メソッド:

  `call(ret)`

    `self`が記憶した状態へ継続します。retは、`callcc`の戻り値になりま す。

前 - 上 - 次 - 目次

matz@netlab.co.jp