yarv-dev:665
From: SASADA Koichi <ko1 atdot.net>
Date: Fri, 07 Oct 2005 17:03:25 +0900
Subject: [yarv-dev:665] Re: environment in eval
ささだです. Yukihiro Matsumoto wrote: > まつもと ゆきひろです > > In message "Re: [yarv-dev:663] Re: environment in eval" > on Thu, 06 Oct 2005 11:52:29 +0900, SASADA Koichi <ko1 atdot.net> writes: > > |b = binding > |eval('a=1', b) > |eval('b=2', b) > |eval('c=3', b) > | > |eval('p local_variables', b) > | > | という例で、a, b を定義した時点での環境が欲しい(c=3 はまだやっていな > |い環境が欲しい)ということをしたい場合、残らない方法(笹田案)じゃないと > |実現できない気がします。いや、これがしたいか、と言われるとイマイチですが。 > > そういう時にはbindingをdupするのではないでしょうか。 (上記例では b という変数が上書きされるので,binding は他の変数名に代入 されるとしてください) 今,Binding#dup をやったら,アロケータがなくてエラーになりました. ruby 1.9.0 (2005-08-15) [i386-mswin32] binding.dup #=> Exception `TypeError' at t.rb:1 - allocator undefined for Binding Proc は dup 出来ました.ただし,環境は同じものを指しているような気がします. a = 1 pr = lambda{ b = 2 } pr1 = pr.dup pr2 = pr.dup eval('c = 3', pr1) eval('p local_variables', pr1) # ["a", "pr", "pr1", "pr2", "c"] eval('p local_variables', pr2) # ["a", "pr", "pr1", "pr2", "c"] -- // 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 ]