[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
の戻り値になりま
す。