- - - 目次

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}" # 1回目
    $n = 200; x = 2; foo1(); p "x = #{x}" # 2回目
              x = 3; foo2(); p "x = #{x}"
  end
  def foo1()
    y = $n + 10 # 1回目 110、2回目 210
    foo11(); p "y = #{y}"
    y = $n + 11 # 1回目 111、2回目 211
  end
  def foo11()
    z = $n + 20                # 1回目 120、2回目 220
    p $n==100 ? "callcc true" : "callcc false"
    $c = callcc {|c|c} if $n == 100; p "z = #{z}" 
    z = $n + 21                # 1回目 121、2回目 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