From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1998-06-17T13:57:09+09:00 Subject: [ruby-list:8387] Re: what type are true and false けいじゅ@日本ラショナルソフトウェアです. In [ruby-list :8379 ] the message: "[ruby-list:8379] Re: what type are true and false ", on Jun/17 10:43(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >| ruby-1,0 filnal: >| eval "foo = 0" >| print "#{foo}\n" >| -> 0 -- >| ruby-1.1b9_6 以降(それ以前の 1.1 がないのでここまで): >| eval "foo = 0" >| puts foo >| -> NameError > >この動作の違い("#{foo}"はOK,fooはダメ)は1.0の頃からです.で, >その理由は > > ローカル変数はコンパイル時に代入される必要がある > >というものです.つまり,後者ではfooが参照されるレベルではロー >カル変数fooに代入が行われていないので,fooという識別子をロー >カル変数と見なすことができないのです.一方,前者では式展開 >(の為のコンパイル)はevalの後に動的に行われるので,fooはロー >カル変数であると見なされます. これはバグじゃなかったのですね. # 失礼しました(__;;; >> 特に稲葉さん とはいえ, 納得できるようなできないようなですね... eval "foo = 0" puts foo は駄目で, eval "foo = 0" eval "puts foo" はOKというのも... 直観に反していますね. >これはrbcのエミュレーションが不完全だからですね.irbだとまし >になってるんじゃないでしょうか? うーん. 無理ですよね. というのもirbって(評価できる時点での)逐次実行で すから, some_binding = proc{proc{}}.call eval 'eval "foo = 0"', some_binding eval 'puts foo', some_binding ってなっています. この仕組みを変えると, irbとしての旨味もなくなっちゃいますしね... PS. バグみっけました. # ruby_1.1b_25+patch([ruby-dev:2865],[ruby-list:8381])です. proc { eval "foo = 0" (proc {foo = 10}).call eval "p foo" }.call def zz eval "foo = 0" (proc {foo = 10}).call eval "p foo" end zz 前者がバグだと思います. # def zzと同じように内側のprocのfooと外側のfooは違う変数にならなくては # ならないですよね. # [ruby-dev:2865]のパッチと絡んでそうでやだな... __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@rational.com <<---