[ruby-list:532] Re: meta-level features(Re: bug? and question)

From: matz@... (Yukihiro Matsumoto)
Date: 1996-09-18 06:26:57 UTC
List: ruby-list #532
あちこちで宣伝したのでこのMLの参加者が急増しています.
話が分からない人はどんどん質問してくださいませ.

In message "[ruby-list:531] Re: meta-level features(Re: bug? and question) 	 "
    on 96/09/18, 石塚圭樹 <keiju@shljapan.co.jp> writes:
|
|けいじゅ@SHLジャパンです. 
|
|長いし, 良く分からない記述もいっぱいあります. 許してやって下さい(__;;;

難しすぎます.普通の人はほとんどついていけないレベルになって
ますよ.

|で, safeモードの検討は終ったのですか? 結構色々難しい問題がありそうです
|が??

ぜんぜん終わっていません.lib/safe.rbを見てもらうと分かるの
ですが,とりあえず危なそうなクラスと関数を潰してるだけです.
また,現在のsafe.rbは一度safe modeに入ると戻れませんから(そ
れはそれで望ましい性質なのですが),うかつに使えないという欠
点があります.

Pythonのrexecのような形にした方が良いのかも知れませんが,そ
うなるとrubyではまだ検討されていないname spaceの操作のあたり
をはっきりさせないといけないようですね.

Pythonのrexecはrshを実行する…わけではなくて,ある範囲のオブ
ジェクトにアクセスできない状態で evalするものです.

|>です.最後に駆け込みで追加した全てのオブジェクトを返すメソッ
|>ド Module#each_object, Object.each_live_objectは(前者はその
|>クラスのサブクラスだけ)は動作が怪しいです.
|
|となっていますが, モジュールからオブジェクトへのポインタは持っているの
|ですか? それとも, 全オブジェクトをアクセスしているのかな?

全オブジェクトにアクセスしてそのクラス/モジュールの kind_of?
で比較してフィルタリングしています.なんて乱暴な.

|>あるオブジェクトがあって,それに対して扱うことができるメソッ
|>ドの一覧が欲しいというモデルですよね.あるオブジェクトにこの
|>メソッドを実行できるかと聞くことならできるんですけどね.
|
|メソッド名からですか?

ええ,

   defined? obj.method

という述語はそのメソッドが(publicとして)定義されている時には
真(文字列ですけど)を返します.

   defined? foo

はfooがメソッドであれば "method" という文字列を,ローカル変
数参照であれば "local-variable" という文字列を返します.文字
列が与えられている時には

  eval "defined? obj."+method

などという手を使います.え? 卑怯?

Kernel#respond_to?(mid[, priv])を復活させましょうか.

|中間クラスは, (複数の)モジュールのメソッドのハッシュテーブルのために持っ
|ているんですね. すると, intermidiate class から moduleへのポインタがあ
|れば問題は解決するわけですね. 今のところ, 引用しているmoduleを調べる必
|要がないからこういう仕様になっているわけですね.

そうです.実装に関しては石塚さんが想像された通りです.

|モジュールのアンロードとかを実現しようとしたらモジュールへの参照が必要
|になりますね.

アンロード…あまりやりたくないなあ….

|じゃあ. そのメンバがアクセスメソッドを持つかどうか? なら意味があるでしょ
|う(^^;;

まあ,理屈はそうですけどね.でも中にはsetterしか持たないもの
もあるし,getterしかないものもあるし,あまりアクセスメソッド
と言う言葉にこだわるひつようはないとおもいますけどね.

|>|1. デバッガ. 
|
|>うーん.それってrubyの仕事じゃないような.もともとのrubyの目
|>的は難しいことはCで書いてあとはお手軽にというものですから.
|
|難しいことをCで書くのでは... rubyで実行するには重い処理はCで書いて, あ
|とはrubyでお手軽にではないですか?

あー,たんなる表現の問題です.emacsを思い出してください.難
しいこと(遅いこと,重いこと)をCで書いて残りはelispで書いてあ
るでしょう?

|もいっこ trace_var というわけの分からんコマンドがありますよ. 

これは STkからもらってきました.結構便利ですよ.

|話しは戻りますが, デバッガから, 自分がインクルードしているモジュールが
|分からなかったり, 定義されているメソッドが分からないのも困りものだと思
|いますが??

認めます.なにか考えましょう.

|話しは変わりますが, こういうメソッドはDebugモジュールとかに移動しませ
|んか? それに, Mainモジュールのメソッドであまり使わない関数は他のモジュー
|ルに移動した方が良いのでは?
|
|例:
|  select--> IO(?)
|  rand ---> Numeric or Integer
|  srand --> Numeric or Integer
|  syscall-> これってOS依存ですよね... こういうOS依存の機能は, OS とか
|            いうクラスにまとめた方が良くないですかね?
|  
|あまりないですが...



|>|2. 動的クラス生成. 
|
|>Smalltalkではそういう時に DoesNotRecognize を使うんじゃない
|>ですか? 僕はそう習ったように思いますけど.それならrubyにもあ
|>ります.
|
|DoesNotRecognizeって何ですか? もしかして, subclassResponsibilty(?)のこ
|と? それとも doesNotUnderstand(?)のことかしら?

doesNotUnderstandでしたか?

|どちらにしてもそういうレベルのことをいっているのではありません. elisp
|のedebug-defunは, 関数を定義するS式に手を加えてデバック用のS式を生成し
|ていますよね. それと同じような感じをイメージしていました, あるクラスと 
|そのメソッドに手を加えて新たなクラスを作るような処理を考えていました.
|どういう方法でデバッガを実現しようとしているかわかりませんが...
|
|>クラスを生成するAPIというのは面白そうですが,でもperlみたい
|>に文字列で組み立ててevalで作っちゃうのがruby流なのかも知れま
|>せん.

|でも, rubyは構文が複雑ですのでそういう(クラス生成や下記の構文木レベル
|の)APIがある方が楽になりますよね.

ううう.作る方は確かにその方が楽でしょうけど,そういうAPIを
作る身にもなってくださいよぉ.evalで済むことはevalでやって欲
しいなあ.

# ただでさえ,設計,プログラム,デバッグ,議論,ドキュメント
# 書き(日・英)とひとりでなんでもやらなくちゃいけないのに….
# 愚痴モードになってしまった.

|結論:
|
|* rubyのデバッガ(ブラウザも)は, 実行時のイメージが必要.
|* そのサポートは, MLFで行う.
|* MFLでは, オブジェクトやクラスから色々な情報(メソッド名, モジュール名
|  など)を取り出せる必要がある.

まあ,この点に関しては賛成します.問題はどういうAPIとどうい
う実装にするかですよね.できれば現状に大きな変更を加えないも
のが良いなあ.

|あと, rubyのデバッガ上でクラス定義を行えるようにしたいなら. クラスを再
|定義できる機能も必要になりますね. 将来的にブラウザ(rubyプログラミング
|環境)まで考えているなら, こういう機能も必要になりますし, こういう機能
|があれば, デバッガから進化させるのも容易だという気がします. あと, 動的
|にスーパークラスを変更する機能とかもひつようかな??

むむむ,rubyの場合プログラミング環境と実行環境は分離していた
方が良いのではないかという気がしています.

                                まつもと ゆきひろ /:|)

In This Thread

Prev Next