From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1997-07-10T17:07:34+09:00 Subject: [ruby-list:3319] Re: meta programings [Re:exceptions (Re: Ver 1.1 [Re: Matrix])] けいじゅ@今はフリー(^^;;;です. In [ruby-list :03313 ] the message: "[ruby-list:3313] Re: meta programings [Re:exceptions (Re: Ver 1.1 [Re: Matrix])] ", on Jul/10 11:06(+0200) matz@caelum.co.jp (Yukihiro Matsumoto) writes: >|イメージが違うかも知れないっすね. 今までこの手のプログラムをやっていて >|めんどくさいなと思った点として, >| >|1. あるクラスにローカルなクラスの定義 >|2. そうやって生成したクラスに対して, クラス定数, メソッドなどを定義する >|3. メソッド定義時おける文字列操作のめんどくささ >context-classってのは良く分かりませんが,こういうのを作って ああ. 説明不足でしたね. これが重要で, context-classでクラスまたは bindingを指定するとそこでローカルなクラスを生成するというものでした. >みたんですけど,どうでしょう. > Module.new(name) > Class.new(name[, super]) >以下のようなプログラムが動いています. > > 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 なかなか使いやすそうですね. ただ, 先の context-class が指定できないの がローカルクラスを作る時面倒です. あ. でも, module A ... end の Aは, モジュールが代入された変数でもいいんですよね? つまり, a = Foo::Bar::Baz # あるモジュール module a ... end も OK? それなら問題ないかなあ... >で,こういうの作ってみて分かったんですが,これをメソッドの中 >から呼ぶとnested method definitionといって怒られます.この辺 >をなんとかしないと使いにくいでしょうね. そうですね. >あと,トップレベルでは自動的にprivateになる仕様もこういう時 >には面倒でした. なにがでしたっけ?? >定数やメソッドの定義は,イテレータブロックで行うのではなく, >関数的なAPIにした方が良いのかも知れません. 定数はともかく, メソッド定義は関数的でないと使いづらい場合も多いと思い ます. とくに, 動的にコードを生成する時には. >|問題は3で, 文字列操作よりも簡単に行うには, 構文をそのままクラスとして >|マップした何かがあればいいかなと思ったわけです. イメージとしては, リス >|ト処理でLispのプログラムを作るイメージです. リスト処理に相当する元とし >|て構文処理かなと... >|# でも, そこまでしなくても良いかなあ... >lispじゃないんだから…. ですねえ.... ここまで話しが進んだので, 他のAPIのリクエストも出しましょう. Module#def_method(name, source) メソッドを定義する. Module#class_variables クラス変数の一覧 Module#class_variable_value(name) クラス変数の値 Module#class_variable_value(name, value) クラス変数の値を設定する (Module#instance_variables インスタンス変数の一覧. 必要か?) Module#methods メソッドと(private/public)の組みの一覧を返す. Module#includes インクルードモジュールの一覧を返す. Object#instance_variables インスタンス変数の一覧 Object#instance_variable_value(name) インスタンス変数の値 Object#instance_variable_value(name, value) インスタンス変数の値を設定する Object#methods メソッドと(private/public)の組みの一覧を返す. Object#extends エクステンドモジュールの一覧を返す. とりあえずこれだけあれば, クラス/オブジェクトの素性は分かるようになり, かつ操作ができるようになり思います. # あと, undef系があるかな... あと, 松本氏はいやがるかも知れませんが, Module#methods_sources メソッドと(private/public)とソースコードの組みの一覧を返す. Object#methods_source メソッドと(private/public)とソースコードの組みの一覧を返す. があるかな. あと, APIとしては, Object#instance_variables ではインスタンス変数を表 す特別なオブジェクトを返す方法もありますね. そうすると, Object#instance_variable_valueはいらなくなって, InstanceVariable#value みたいなメソッドが必要になりますね(私個人として は, こっちのインターフェイスの方が好きなのですが...). あと, イテレータ とする方法もあるかな? object.instance_variables do |name, access, value| ... end イテレータにすると値まで取り出せるわけですね. __ .........................................石塚 圭樹@今はフリー(^^;;... ------->>また, アドレス変わりました!! e-mail: keiju@bc.mbn.or.jp <<---