[ruby-list:516] Re: meta-level features(Re: bug? and question)
From:
matz@... (Yukihiro Matsumoto)
Date:
1996-09-12 06:32:00 UTC
List:
ruby-list #516
まつもと ゆきひろです.
In message "[ruby-list:496] Re: meta-level features(Re: bug? and question) "
on 96/09/11, 石塚圭樹 <keiju@shljapan.co.jp> writes:
|
|けいじゅ@SHLジャパンです.
|>できます.実装上は特異メソッドを持つクラスは本当のクラスから
|>名前の無いクラスにChangeClassしています.これを処理形内部で
|>は特異クラス(singleton class)と呼んでいます.
|
|きっと, 特異メソッドを持つオブジェクトはという意味ですよね? つまり, 特
|異メソッドを持つインスタンスは特異クラスをもっているわけですね?
そうです.
|ここでクラスメソッドが定義されているわけですね.
そうです.
|ここでいっているセキュリティって何ですか?
アプレットみたいなものを想定しています.外から持って来たプロ
グラムが悪さをしないことを保証できる仕組みがあると良いじゃな
いですか.
|ソースコードからしか実行できないrubyにセキュリティという概念があるとも
|思えませんが...
いや,ソースコードがあってもチェックしなければおんなじですよ.
普通に使う範囲内なら考えなくても良いんですけどね.それにjava
にもperlにもpythonにもsafeモードがあるのにrubyにないのは悔し
いじゃないですか.
|>これはeval(object.type)で実現して頂くしか無いのではないかと
|>思います.
|
|これだと, 特異クラスを取り出すことはできなくなりますね...
元から特異クラスには触ることはできません.あくまでも実装上の
都合で言語が提供するモデルには無いものですから.言語上のモデ
ルではあくまでも「そのオブジェクトがメソッドを知っている」と
いうものです.
|へ? あるモジュールをインクルードしているかどうかが分かるなら, オブジェ
|クトからモジュールを得ることができてもおかしくないんですが... 逆なんで
|すか? モジュールからインクルードしているオブジェクトやクラスが分かる?
あるオブジェクトがどのモジュールをインクルードしているかは分
かるんですけど,それは内部で共有しているハッシュテーブルのア
ドレスが同じかどうかで判定していて,もとのモジュールへのポイ
ンタを持っていないんです.
まあ,これはどうしても必要であれば変えられますけどね.それに
全部のオブジェクトをスキャンするという荒技もあり得ますね.
|これは, 関数の実体という意味ではなく, メソッドのスロットという意味です.
|後で出てくるメソッドのアクセス権を保持するオブジェクトです.
あるオブジェクトがあって,それに対して扱うことができるメソッ
ドの一覧が欲しいというモデルですよね.あるオブジェクトにこの
メソッドを実行できるかと聞くことならできるんですけどね.
そういうモデルじゃダメですか
|うーん. どういう内部構造をしているのだろう...
こうなっています.かなり変則的.
super class -> hash table
^
|
intermidiate class -> hash table <- module
^
|
singleton class -> hash table
^
|
Object -> class -> hash table
オブジェクトとクラスは良いですよね.で,クラスとスーパークラ
スの間には特異クラスと中間クラスがはさまっています.これは実
装上の都合で導入されたものでrubyからは見えません.
さっきも書いたようにkind_of?はこのハッシュテーブルが同じもの
が先祖にあるかどうかで判定しています.
|>ちなみにrubyでアクセスメソッドといっているのはC++などでのイ
|>ンスタンス変数と同じような形式で呼び出せる単なるメソッドのこ
|>とです.
|
|では, メンバからアクセスメソッド(のスロット)を得る関数がありますね.
まだ伝わっていないようですが,アクセスメソッド(と呼ばれるこ
とがある)ものは普通のrubyのメソッドです.メンバと関連がある
かどうかはインタプリタも知りません.たまたま @memberに対して
memberとmember=というメソッドが定義されているだけです.
|あとは, メソッド名をある関数に渡してそれを引数にアクセス権を調べる方法
|もありますね.
それはできます.
|MLF(Meta-Level-Featuer)の目的を考えなくてはなりませんね. 2つ例を考えて
|みました.
feature
|1. デバッガ.
|
|inspectみたいなものをユーザが独自に作れるため. 少なくとも, membersが必
|要. あと, インスタンス変数に強制的にアクセスする機能が必要ですね. 良く
|考えるとインスタンス変数名をとってきても, そこからアクセスする方法がな
|いと困りますね.
|
|特に, Smalltalkのような pure ruby 環境を作りたいと思っているならこうい
|うプロトコルは必要そうです.
うーん.それってrubyの仕事じゃないような.もともとのrubyの目
的は難しいことはCで書いてあとはお手軽にというものですから.
ただ,デバッガを作るのに必要な機能くらいはrubyからアクセスで
きないといけないと思いますので,その辺は検討が必要でしょう.
今は caller くらいしかないなあ.
|2. 動的クラス生成.
|
|例えば, あるクラスを与えてその情報から新たなクラスを生成するなど. C++
|のパラメトライズドクラスの動的版ですかね... 元クラスの情報が欲しくなり
|ますよね.
Smalltalkではそういう時に DoesNotRecognize を使うんじゃない
ですか? 僕はそう習ったように思いますけど.それならrubyにもあ
ります.
|もしかしたら, elispのedebug-defunのように, デバッグ用の関数やクラスを
|生成するとかかも知れません.
クラスを生成するAPIというのは面白そうですが,でもperlみたい
に文字列で組み立ててevalで作っちゃうのがruby流なのかも知れま
せん.
|でも, そういった意味でのMLFも面白いですね. 論理的なプログラム構造がオ
|ブジェクトとして取り扱えるというのも.
構文木とかに触れちゃったりするんですか? うーむ.
まつもと ゆきひろ /:|)