From: matz@... (Yukihiro Matsumoto) Date: 1998-06-17T14:26:10+09:00 Subject: [ruby-list:8388] Re: what type are true and false まつもと ゆきひろです In message "[ruby-list:8387] Re: what type are true and false" on 98/06/17, 石塚圭樹 writes: |けいじゅ@日本ラショナルソフトウェアです. |とはいえ, 納得できるようなできないようなですね... | | eval "foo = 0" | puts foo | |は駄目で, | | eval "foo = 0" | eval "puts foo" | |はOKというのも... 直観に反していますね. まあ,直感に反していないというつもりもないんですが,他のとこ ろとの兼ね合いで次善だと考えています.現在のrubyの仕様と矛盾 が無い方法でこの挙動を直感に合わせるのは難しいでしょう. たぶん,ここを直感に合わせるとirbのようなプログラムが全滅す るのではないかと思います. |PS. |バグみっけました. |# ruby_1.1b_25+patch([ruby-dev:2865],[ruby-list:8381])です. これは…バグと呼ぶにはかわいそうな気がします(私が^^;;;). どっちかっていうと仕様変更(ていうかバグフィックス)でしょう. まず関数版は |def zz | eval "foo = 0" # eval内で通常ローカル変数fooの宣言 | (proc {foo = 10}).call # 静的な構文上はここが初出 # ブロック中なのでブロック内ローカル変数 | eval "p foo" # 通常ローカル変数の参照 |end |zz という動作をしていますが,proc版は |proc { | eval "foo = 0" # ブロック内ローカル変数fooの宣言 | (proc {foo = 10}).call # ブロック中なのでブロック内ローカル変数 | eval "p foo" # ブロック内ローカル変数fooの参照 |}.call となります.つまり,関数版とproc版で外側のfooの変数としての 種別が違うのが原因です.以前のものではeval内で宣言されたロー カル変数は問答無用で通常ローカル変数になってました.evalは 「その場所にその文があったと同じように動作する」というのが目 標ですから,私は以前の動作の方がバグであったと思います. が,これがややこしいことを否定するつもりはないので,よりよい 挙動の定義があれば(それが現状を大きく崩すものでなければ)そち らを採用しても良いと思っています. まつもと ゆきひろ /:|)