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