From: keiju@... (Keiju ISHITSUKA) Date: 1997-07-11T18:07:19+09:00 Subject: [ruby-list:3331] Re: meta programings [Re:exceptions (Re: Ver 1.1 [Re: Matrix])] けいじゅ@今はフリー(^^;;;です. In [ruby-list :03320 ] the message: "[ruby-list:3320] Re: meta programings [Re:exceptions (Re: Ver 1.1 [Re: Matrix])] ", on Jul/10 17:38(JST) matz@caelum.co.jp (Yukihiro Matsumoto) writes: >|なかなか使いやすそうですね. ただ, 先の context-class が指定できないの >|がローカルクラスを作る時面倒です. > >っていうか,Class.new/Module.newは定数を定義しないので >context-classというのは存在しません.戻り値として与えられる >クラス(あるいはモジュール)を定数なり変数なりに代入してくださ >いませ.定義部はイテレータブロックを使っているのでバインディ >ングは変更できません. うーん. そういうことですか.... ちょっと気になることが1つ. 今までのクラ スは文字列に直すと, クラスを定義したところのパスが出ますよね. つまり, module Foo class Bar ... end end Foo::Bar.to_s --> Foo::Bar この辺りの表現はどうなるんですか? とくに, object.type は文字列を返すの で, 一意性が崩れてしまって使いづらくなると思いますが? >| a = Foo::Bar::Baz # あるモジュール >| module a >| ... >| end >| >|も OK? それなら問題ないかなあ... > >だめです.Aはかならず定数でなければなりません.Foo::Bar::Baz >に機能を追加したければ > > module Foo > module Bar > moduel Baz > end > end > end > >とするしかないですね. いや. これがチョーめんどくさいからやりたくないんですけど... でも. a = Foo::Bar::Baz a.constant_value("class-name") = Module.new("class-name") {...} と書けるのかな? それなら問題ないな. >トップレベル(class/moduleの外)でdefするとprivate methodにな >ります.これはトップレベルでの定義されるのは関数(的メソッド) >であろう,ということからです.普段は確かにそうなんですけど, >こういう時は不便ですよね. なるなる. >|定数はともかく, メソッド定義は関数的でないと使いづらい場合も多いと思い >|ます. とくに, 動的にコードを生成する時には. > >動的にコードを生成する? lispじゃないんだから. まあ. そういわないで, 実際やっているんだから(^^;;; >|ここまで話しが進んだので, 他のAPIのリクエストも出しましょう. >| >| Module#def_method(name, source) >| メソッドを定義する. >sourceって文字列なんですか? どういう感じなんだろう? Foo.def_method("f(n)", "n + 1") の様な感じですが. 何か変ですね... まあ, とにかくメソッドを動的に追加するメソッドです. >| Module#class_variables >| クラス変数の一覧 >クラス定数ですよね.Module#constantsかしら? おお. そうですね. >| Module#class_variable_value(name) >| クラス変数の値 >Module@constant_value(name)かな? たしかに. >| Module#class_variable_value(name, value) >| クラス変数の値を設定する >Module@constant_value(name)=valueでは? なるなる. 素晴らしい!! >| (Module#instance_variables >| インスタンス変数の一覧. 必要か?) >オブジェクト毎に違うわけですから,Moduleとしては得られないで >しょう. ですよね. >| Module#includes >| インクルードモジュールの一覧を返す. >これ,現在の実装では情報を持っていません.実装するのはちょっ >と面倒ですねえ. ですかあ.... >| Object#methods >| メソッドと(private/public)の組みの一覧を返す. >これだとModule/Classそのもののmethodを取れませんね.重複しちゃ >うから. そうなんですよ. 私も後で気づきました(^^;;; >| Object#extends >| エクステンドモジュールの一覧を返す. >これも情報が取ってないです.どうしよう. ですかあ.... >|# あと, undef系があるかな... > >まあ,よいですけど….なんか,ここで既に大げさで(完全性は満 >たしているかも知れませんが),rubyらしくない気がしてます. そうですかねえ... >|あと, 松本氏はいやがるかも知れませんが, >| >| Module#methods_sources >| メソッドと(private/public)とソースコードの組みの一覧を返す. >| Object#methods_source >| メソッドと(private/public)とソースコードの組みの一覧を返す. >| >|があるかな. >いやがるもなにも,どうやって実装するんですか? さすがにMOPの >ような普段使わない機能のためにメソッド毎のソースを保存して普 >段の効率を落す気は無いですし,それ以外の方法って思い付かない >ですし.それにCで実装されているメソッドにはソースは無いです >よね. ですねえ... >|object.instance_variables do >| |name, access, value| >| ... >|end >| >|イテレータにすると値まで取り出せるわけですね. >インスタンス変数のaccessってなに? すいません. なかったことにして下さい. >最終的な印象としてはちょっと抵抗があるというのが事実です.ま >あ,とりあえずは抵抗の無い > > Module#constants > Object#methods > >くらいを導入しようかなあ.あ,でもクラスに対してmethodsって >聞いた時にはクラスオブジェクトの知っているメソッドではなく, >クラスインスタンスの知っているメソッドを返して欲しいなあ. この文章難しいなあ... クラスの特異メソッドを返したいのか, クラスで定義 されたメソッドを返したいのか... __ .........................................石塚 圭樹@今はフリー(^^;;... ------->>また, アドレス変わりました!! e-mail: keiju@bc.mbn.or.jp <<---