前田です。

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が呼ばれた時点で関連するスコープのローカル変数だけすべてヒ
ープに移すことができればよいのですが、ちょっとその方法が思いつき
ません。
# どなたかよいアイデアはないでしょうか。

-- 
前田 修吾