From: matz@... (Yukihiro Matsumoto) Date: 1997-07-10T11:06:46+09:00 Subject: [ruby-list:3313] Re: meta programings [Re:exceptions (Re: Ver 1.1 [Re: Matrix])] まつもと ゆきひろです In message "[ruby-list:3309] Re: meta programings [Re:exceptions (Re: Ver 1.1 [Re: Matrix])]" on 97/07/09, 石塚圭樹 writes: |けいじゅ@今はフリー(^^;;;です. |イメージが違うかも知れないっすね. 今までこの手のプログラムをやっていて |めんどくさいなと思った点として, | |1. あるクラスにローカルなクラスの定義 |2. そうやって生成したクラスに対して, クラス定数, メソッドなどを定義する |3. メソッド定義時おける文字列操作のめんどくささ | |があります. | |1, 2に対しては, 構文ベースでない関数ベースのAPIがあれば良いかなと感じ |ています. | |1. | new_class = Class.new("class-name", super-class, context-class) |2. | new_class.def_class_constant(:variable_name) | new_class.def_method("method source") | ... | |などなど. これらは, Classの(特異)メソッドで十分な気がします. context-classってのは良く分かりませんが,こういうのを作って みたんですけど,どうでしょう. Module.new(name) nameで指定される名前を持つ新しいモジュールを生成する.戻 り値は定数などにバインドされていないので,自分で設定する 必要がある.イテレータとして呼ばれた時にはイテレータブロッ ク内で定義したメソッドは新たに生成されたモジュールに定義 される. Class.new(name[, super]) nameで指定されるsuperをスーパークラスとする新しいクラス を生成する.他はModule.newと同じ. 以下のようなプログラムが動いています. module A Foo = Module.new("Foo"){ def bar print "bar\n" end } p Foo.type Bar = Class.new("Bar"){ include Foo def baz print "baz\n" end } p Bar.type p bar = Bar.new bar.bar bar.baz end で,こういうの作ってみて分かったんですが,これをメソッドの中 から呼ぶとnested method definitionといって怒られます.この辺 をなんとかしないと使いにくいでしょうね. あと,トップレベルでは自動的にprivateになる仕様もこういう時 には面倒でした. 定数やメソッドの定義は,イテレータブロックで行うのではなく, 関数的なAPIにした方が良いのかも知れません. |問題は3で, 文字列操作よりも簡単に行うには, 構文をそのままクラスとして |マップした何かがあればいいかなと思ったわけです. イメージとしては, リス |ト処理でLispのプログラムを作るイメージです. リスト処理に相当する元とし |て構文処理かなと... | |# でも, そこまでしなくても良いかなあ... lispじゃないんだから…. まつもと ゆきひろ /:|)