toyofuku / juice.or.jp wrote:
> 
>   豊福@パパイヤです。

>   y と z の print をどこに入れたのかわからないでまだ答え
> られないのですが、ともかく私が確認したかったのは一回目の
> foo11 までのスタックと二回目の foo11 までのスタックは別の
> スタックになるのだろう、別のスタックなら二回目の foo11 で
> のローカル変数の値の変更は $c.call に影響を与えないのでは
> ということです。

自分の1.3.3での実験では、豊福さんの考えられているとおりのようです。

 % cat callcc-toyofuku3.rb
 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 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"

ちなみにscm 5d0でもcallcc後
  z = 121
  y = 111
  x = 3
のようです。
--
			稲葉 浩人  <inaba / st.rim.or.jp>