[前][次][番号順一覧][スレッド一覧][生データ]

yarv-dev:663

From: SASADA Koichi <ko1 atdot.net>
Date: Thu, 06 Oct 2005 11:52:29 +0900
Subject: [yarv-dev:663] Re: environment in eval

 ささだです。

Yukihiro Matsumoto wrote:
> あ、すいません。どちらにも解釈できますよね。私の思いは前者で
> した。が、それは現状の実装に引きずられすぎているのかもしれま
> せん。確かにevalでローカル変数が残らない新実装にあっては
> bindingにも残らないとするのがきれいなのかなあ。
> 
> でも、そうしないと名前空間が汚れる(今回の例だとbという変数が
> 見えてしまう)上に、その変数を書き換えてしまうことで変な動作
> を起こせてしまうわけですよね。とすると、Bindingに残るとした
> 方が使いやすさからは上ということになりそうな。
> 
> # すいません。確定的な結論でなくて。

b = binding
eval('a=1', b)
eval('b=2', b)
eval('c=3', b)

eval('p local_variables', b)

 という例で、a, b を定義した時点での環境が欲しい(c=3 はまだやっていな
い環境が欲しい)ということをしたい場合、残らない方法(笹田案)じゃないと
実現できない気がします。いや、これがしたいか、と言われるとイマイチですが。

 環境に副作用を許すか許さないか、という感じなのかなぁ。


> | binding の意味をイマイチわかっていないのですが,どこかに資料などありま
> |すか.
> 
> 例によってないです。bingingはその時点でのクロージャのような
> ものだと思って実装してました。いや、実際現状のRubyではクロー
> ジャそのものなんですが。

 今 YARV では、

 Proc は Binding (今は Env という名前)を複数持つ。
 Binding (Env)は各フレームごとに作られる。

  def m
      a = 1
      1.times{
        b = 2
        binding
        pr = proc
      }
    end
    #=>
    env_a, env_b という Env オブジェクトを作って、
    env_b が env_a へのポインタを持つ。

    pr は env_b へのポインタを持つ Proc オブジェクト

 という実装をしています。


  b = binding
  cnt = 10000
  Thread.new{
    cnt.times{|e|
      l = "lt_#{e}"
      eval("#{l} = nil", b)
    }
  }

  cnt.times{|e|
    l = "lm_#{e}"
    eval("#{l} = nil", b)
  }
  eval("p local_variables")


 こんな例を考えると悩ましいですね。

-- 
SASADA Koichi at atdot dot net

--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]

       654 2005-10-05 15:42 [ko1 atdot.net       ] environment in eval                     
       655 2005-10-05 16:01 ┗[matz ruby-lang.org  ]                                       
       656 2005-10-05 16:15  ┗[ko1 atdot.net       ]                                     
       657 2005-10-05 16:36   ┗[matz ruby-lang.org  ]                                   
       658 2005-10-05 16:48    ┗[ko1 atdot.net       ]                                 
       660 2005-10-05 17:50     ┗[matz ruby-lang.org  ]                               
       661 2005-10-05 18:03      ┗[ko1 atdot.net       ]                             
       662 2005-10-05 18:26       ┗[matz ruby-lang.org  ]                           
->     663 2005-10-06 11:52        ┗[ko1 atdot.net       ]                         
       664 2005-10-07 16:45         ┗[matz ruby-lang.org  ]                       
       665 2005-10-07 17:03          ┗[ko1 atdot.net       ]                     
       666 2005-10-07 17:15           ┗[usa garbagecollect.j]                   
       667 2005-10-07 17:19            ┗[matz ruby-lang.org  ]                 
       668 2005-10-07 20:45             ┣[ko1 atdot.net       ]               
       669 2005-10-07 21:51             ┃┗[shiro lava.net      ]             
       670 2005-10-07 23:34             ┗[nobu.nokada softhome]               
       671 2005-10-08 00:40              ┗[matz ruby-lang.org  ]