From: Shugo Maeda Date: 1999-03-17T18:01:06+09:00 Subject: [ruby-dev:6391] value of NODE_DEFN 前田です。 現在の、スコープにvisibilityに関する情報を持たせる方法は、クラスが小 さいうちは見やすいのですが、クラスが大きくなってくると今見ているメソッ ドのvisibilityを把握しにくいという側面があります。 Rubyと同じように(C++と違って)メソッドの宣言と実装が一緒になっている JavaやSatherでは各メソッド定義ごとにvisibilityを指定するのでこの問題 がありません。 Rubyでも、 class Foo def foo ... end private :foo end とすればよいのですが、fooと二回書かなければいけない点などがちょっと 面倒です。 そこで、privateなどを予約語にしなくても、 class Foo private def foo ... end end と書ける方法を思い付きました。 --- eval.c.orig Wed Mar 17 14:56:14 1999 +++ eval.c Wed Mar 17 14:56:36 1999 @@ -2557,7 +2557,7 @@ rb_funcall(ruby_class, rb_intern("method_added"), 1, INT2FIX(node->nd_mid)); } - result = Qnil; + result = INT2FIX(node->nd_mid); } break; @@ -2591,7 +2591,7 @@ NOEX_PUBLIC|(body?body->nd_noex&NOEX_UNDEF:0)); rb_funcall(recv, rb_intern("singleton_method_added"), 1, INT2FIX(node->nd_mid)); - result = Qnil; + result = INT2FIX(node->nd_mid); } break; --- parse.y.orig Wed Mar 17 14:57:06 1999 +++ parse.y Wed Mar 17 14:57:11 1999 @@ -3766,8 +3766,6 @@ case NODE_UNTIL: case NODE_CLASS: case NODE_MODULE: - case NODE_DEFN: - case NODE_DEFS: yyerror("void value expression"); return Qfalse; break; ソースの変更が少ないわりに文法的に大きな変更かもしれません。 しかし、メソッド定義式の値をメソッドIDにするというのはそれほど不自然 な変更ではないと思うのですが、いかがでしょう。 -- 前田 修吾