From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1997-08-17T13:31:48+09:00 Subject: [ruby-dev:148] Re: meta programming features けいじゅ@日本ラショナルです. In [ruby-dev :00146 ] the message: "[ruby-dev:146] Re: meta programming features ", on Aug/17 02:01(JST) matz@netlab.co.jp (Yukihiro Matsumoto) writes: >まつもと ゆきひろです >|この問題は, >| >| class << foo ... end >| >|がある限り解決しないと思いますが... > >これはclass << fooの構文内では仮想的なクラスを見せているだけ >だ,というモデルを採用することにします.つまり,現在の実装で >は特異クラスを使っているが言語の採用しているモデルでは必ずし >も特異クラスの存在する必要はないと言うことで. 了解しました. ということは, rubyの用語(実装上の用語を省く)上では特異ク ラスという言葉はなくなるんですね? >ついでに,この仮想クラス(特異クラスのこと)のインスタンスを作 >ることと,サブクラスを作ることを禁止するようにしましょうね. あ. そうするんですか. まあ, 本来できるべきではないですしね. クラス定数はどうします? 仮想的なクラスとなるとクラス定数を持つのも変か なという気もしますが?? まあ存在するとしても, 特異メソッドと同じく特異 クラス定数であると考えればいいのかな? # 私は残しておいて欲しいんですけどね. >|そういったわけで, Object#eval() も通常クラスへの登録が基本で良いと思う >|んですが... >というかやっぱり関数的な eval に求められる挙動とfoo.evalの形 >で呼ばれることを想定した時に求められる挙動とではかなり違って >いるように思います. >たとえば定数アクセスを例にとると > * 関数的アクセスの場合には呼ばれた時点での静的なスコープも > 参照して,「その場所にコードがあったのと同じ動作」を実現 > して欲しい. > * メソッド的アクセスの場合には(そのインスタンス内部からの > アクセスということで)適切な静的なスコープは存在しないだ > けでなく,メソッド呼び出し元のスコープを参照するべきでは > ない >という違いがあります.これは定数の定義や,メソッドやクラスな >どの定義に関してもいえることです. メソッド的アクセスのevalの仕様に関しては, なるほど最もという点が多いん ですが... 前に議論のあった, Module#evalは, * ローカル変数は静的スコープで共有 * クラス定数は静的スコープで参照可能(selfのクラス定数優先) という仕様になったと思いますが, この仕様と上記のメソッドevalの仕様とが 食い違っているのが気になるんですけど. 少なくとも静的スコープでのローカル変数と共有しないと嬉しさ半減ですよね え... >ですから,「そのインスタンスのスコープでevalするメソッド」を >用意するにしても,現状のevalと共有することは(おそらく)不可能 >だと思います.せめて,名前を変える必要があるのでは. うーん.... >|特異メソッドが存在するか調べる方法があれば, foo.eval("def foo.f...") >|を使えるのですが... > >foo.respond_to?("f") と foo.type.methods.include?("f") を組 >み合わせると調べられるのでは? 特異メソッドfoo.fは存在するが, メソッドFoo#fが存在しない場合は, 分かる と思いますが, メソッドFoo#fが存在している時に特異メソッドfoo.fが存在す るかどうかは分からないのでは? __ ..........................................石塚 圭樹@日本ラショナル... ----------------------------------->> e-mail: keiju@bc.mbn.or.jp <<---