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 ]