前田です。 At Wed, 21 Apr 1999 13:23:00 +0900, <toyofuku / juice.or.jp> wrote: > > なぜそうなるかというと、ローカル変数はスタックに割り当てられるの > > で、callccでスタックをコピーする時にその時点でのローカル変数の状 > > 態を保存してしまうからです。 > > 逆にブロックローカル変数の方はヒープに割り当てられるためコピーさ > > れないので、それ以降の変更が有効になります。 > > トップレベルローカル変数もヒープに割り当てられているということですか。 トップレベルのローカル変数はスタックに割り当てられるのですが、ス タックのコピーをする時に、トップレベルのローカル変数はコピーされ ないようになっているみたいです。 > 上のコードを関数の中に入れた > > def foo() > $n = 0 > k = 0 > for i in 0..2 > callcc { |c| $cont = c } if i == 0 > printf("%d) i = %d, k = %d\n", $n, i, k) > end > k += 1 > exit if ($n+=1) == 2 > print "Jump!\n" > $cont.call > end > > だと 0 に戻るのかな。 たぶん、そうなると思います。 また、scope_dupなどが呼ばれるとローカル変数がヒープにコピーされる ので、すべてのローカル変数がスタックに置かれているわけではないで す。 Schemeと同じ動作にするにはローカル変数をすべてヒープに置くのが一 番簡単なのですが、それだと遅くなってしまいます。 callccが呼ばれた時点で関連するスコープのローカル変数だけすべてヒ ープに移すことができればよいのですが、ちょっとその方法が思いつき ません。 # どなたかよいアイデアはないでしょうか。 -- 前田 修吾