From: matz@... (Yukihiro Matsumoto) Date: 1997-07-24T07:34:55+09:00 Subject: [ruby-list:3419] Re: meta programming features まつもと ゆきひろです In message "[ruby-list:3415] Re: meta programming features" on 97/07/23, 石塚圭樹 writes: |けいじゅ@今はフリー(^^;;;です. |>例示された中では ingredients くらいならなんか伝わる気がしま |>すけど. | |やっぱ, flavors ですかねえ... ですかねえ.もうちょっとかんがえましょう. |>これでも外側のスコープでaがローカル変数として代入されている |>場合とそうでない場合で挙動が違ってしまいます. | |そうなんだ, | | a = "Foo" | proc{|a| a = "Bar"}.call | print a |======================= | Foo | |となるという意味? ちゃいます.この場合 a は(イテレータブロックの外で代入されて いるので)常に静的ローカル変数です.ですから,この結果は ======================= Bar です.動的ローカル変数とは「イテレータブロックの中で最初に代 入された変数」のことです. |>|a = "Foo" |>|eval "|a| A = a", Foo.class_binding, a |> |>evalじゃない別のものになってしまいますけど,これはこれで意味 |>があるのかなあ. | |別のものですか... evalに渡す文字列はrubyプログラムですが,"|a| A = a"は完全な rubyプログラムではありませんから.たとえば, ruby -ce "|a| A = a" してみれば分かると思いますが. |うーん. なるほど... ところで, バインディングってどんなオブジェクトなん |です? 構造はProcと同じです.ちなみにProcをbindingとして渡しても動 作します.Procはイテレータがスタック上に持っている情報をオブ ジェクト化したもので,だいたい以下のようなものを持っています. * 静的ローカル変数フレーム * 動的ローカル変数フレーム * self * 現在のclass(定数・メソッドの定義先) * そのほか付加的な値 |そうすると, 考えられるAPIとしては: | | Module#モジュール定義 Module#newが使えるようになります. | Module#クラス定義 Class#newが使えるようになります. | Module#定数定義 Module#set_constant(name, value)にしましょう. | Module#メソッド定義 名前はModule#define_methodで良いと思うのですが,どういう APIにしましょうか? Foo.define_method("foo") do |arg| .. end なんてのも変な気がしますが Foo.define_method("foo", "arg", "...") よりはましな気がします("..."はメソッドの定義部). | Module#alias Module#alias_method(new, old)にしましょう. | Module#undef Module#undef_method(name)にしましょう. |ぐらいですか. あと, Module/Class 関係のメソッドでprivateなメソッドがあ |りますが, それをpublicにする必要がありますね. public,private,module_functionなどですか? うーん,そうした 方が良いのでしょうか.せっかくprivateになっているのになあ, という気もしますが.…仕方ないか. まつもと ゆきひろ /:|)