From: Hidetoshi NAGAI Date: 2006-06-21T19:03:35+09:00 Subject: [ruby-dev:28782] Re: binding の仕様変更? or バグ? 永井@知能.九工大です. From: Yukihiro Matsumoto Subject: [ruby-dev:28780] Re: binding の仕様変更? or バグ? Date: Wed, 21 Jun 2006 17:45:13 +0900 Message-ID: <1150879512.687108.4987.nullmailer@x31.priv.netlab.jp> > ということで、ようやっと時間をとって調べてみました。以前これ > が動いていたというのがどうにも納得が行かないので、古いバージョ > ンを改めてコンパイルして調べる必要がありました。 > > 結論からいうと、1.8.3までのバージョンではこのスクリプトは確 > かに動作しますが、それはグローバルな名前空間(Object)にhogeメ > ソッドを定義していたからです。つまり、元々の「グローバルな名 > 前空間を汚染することなく実行したい」という要求を満たしていま > せん。 実は汚染してしまっていたのですね.;;;^_^;;; > では、どうするか、ですが、 > > * 「元の挙動に戻す」のは不可能ではないのですが、「バグを復 > 活させる」ということなので、あまり乗り気ではありません。 > また、元々の要求を満たしていない以上あまり意味がないよう > な気がします。 はい.確かに意味がないと思います. 動くようにはなっても,目指すべき姿ではありませんので. > * なにもしない、だとtkでは困るんですよね。 少なくともウィジェットデモではかなり困ります. ウィジェットデモでは実行中に各デモスクリプトのソースを書き換えて 再実行して効果を試す機能が備わっています. これは学習上有益ですので,重要な機能だと思っています. ですが現状のままですと,関数型のメソッドをちょっと定義して 利用する実験を試みた場合,本来は正しく動くソースであるにも関わらず エラーを生じてしまうケースが発生するになります. これでは学習に悪影響があると言わざるを得ません. どう対応すべきか (何を犠牲にするか) に関して, かなり厳しい選択を強いられることになります. 特に急所を突かれてしまっているのが, 未踏ソフトで現在開発中の Ruby/TkORCA です.(^_^; ローカルでそのままに動かせるスクリプトを sandbox に読み込んで監視しつつ稼働させる仕組みなのですが, 現状のままでは sandbox 内では動かなくなるというケースが かなり増大します. コンセプトとして大幅な後退であり,辛すぎます. # 独自で toplevel_eval のような対策を加えるにしても, # Ruby 自体の再コンパイルが必要ということになってしまいます. # これまで,ノーマルな Ruby の機能範囲で実装,実現するように # 努力してきただけに,努力が水泡に帰すようなことはちょっと...(T_T) > * toplevel_evalの導入。まあ、追加なので1.8でも駄目ではない > と思うのですが。evalが増えると嫌な顔をする人が目に浮かぶ > ようです。 toplevel_eval の中身は module_eval と同じです. 違うのはクラス階層を辿る優先順位にちょっとだけ細工を 加えている点のみ (だったと思う) なのですが, それでも YARV には大きく影響するでしょうか? > ささださん > もうちょっと考えさせてください。ご意見募集中。 元々の挙動がバグであったとすると, ぜひ toplevel_eval またはその修正物を導入していただきたいと思います. でなければ,できた方が望ましい (と思える) ことが できそうでできないということになるのではないでしょうか. load(file, true) についても,それが期待させることを考えるなら, 無名モジュールでの toplevel_eval 相当とした方が良さそうに感じます. ただし,load(file, true) の変更は非互換を含みますので これを今回のリリースで変更することは無理なのでしょうね. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp