[#34] [Bug] Class#superclass — shugo@... (maeda shugo)
前田です。
[#49] Re: Nil is a subclass of Object? — shugo@... (maeda shugo)
前田です。
[#50] Re: [ruby-list:3596] Module#attr specification (Re: boolean values) — keiju@... (石塚圭樹 )
けいじゅ@日本ラショナルです.
前田です。
まつもと ゆきひろです
わたなべです.
[#53] About C struct who has references to ruby objects — shugo@... (maeda shugo)
前田です。
[#58] Re: Nil is a subclass of Object? — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#78] [Bug] Socket#send, Socket#recvfrom — shugo@... (maeda shugo)
前田です。
[#97] Re: meta programming features — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#115] Re: meta programming features — WATANABE Hirofumi <watanabe@...>
わたなべです.
[#117] Re: tail recursion (Re: LaTeX ruby documents) — keiju@... (石塚圭樹 )
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
[#121] Re: meta programming features — keiju@... (石塚圭樹 )
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
[#127] tracer — keiju@... (Keiju ISHITSUKA)
けいじゅ@いそうろう.日本ラショナルです.
まつもと ゆきひろです
けいじゅ@いそうろう.日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
わたなべです.
まつもと ゆきひろです
わたなべです.
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
[#167] argument default value — shugo@... (前田 修吾 / maeda shugo)
前田です。
[#185] Re: [ruby-list:3720] Re: Class#eval [Re: ftplib.rb revision 1.4] — keiju@... (石塚圭樹 )
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
まつもと ゆきひろです
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
けいじゅ@やっと自オフィス.日本ラショナルです.
まつもと ゆきひろです
まつもと ゆきひろです
[#189] include [Re: new sync.rb release] — keiju@... (石塚圭樹 )
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
[#221] '@' in yylex() — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
[#228] How to handle Struct — Eiji-usagi-MATSUmoto <ematsu@...>
うさぎです。
[#232] ruby for mswin32 1.1a1差分 — KIMURA Koichi <kkimura@...>
木村 です。
[#257] [BUG] MLF — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
まつもと ゆきひろです
けいじゅ@日本ラショナルです.
けいじゅ@日本ラショナルです.
[#276] Re: SyslogSendmail class — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#291] illegal here document — shugo@... (前田 修吾 / maeda shugo)
前田です。
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
わたなべです.
[#309] [BUG] method index — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
[#313] ruby 1.1a4 released — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#330] [BUG] Module#methods — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
[ruby-dev:126] Re: meta programming features
けいじゅ@日本ラショナルです.
メイルが長くなってしまいました...
In [ruby-dev :00122 ] the message: "[ruby-dev:122] Re: meta
programming features ", on Aug/13 15:44(JST) matz@netlab.co.jp
(Yukihiro Matsumoto) writes:
>まつもと ゆきひろです
本題にはいる前に, 結構重要なことに気づきましたので, その話しから....
実は, クラスは2種類のクラス変数を持てるんですね...
* Foo::Var
class Foo
Var = ...
end
* Foo.type::Var
class << Foo
Var = ...
end
です. 同じ名前だと前者が優先されているみたいですね?
# 何か話しが複雑になっているなあ...
>|foo = Foo.new
>|foo.eval "X = 1"
>|1. 常に, Foo#Xを定義する.
>|2. 常に, fooの特異クラスのXを定義する.
>|3. Foo#Xがなければ Foo#Xの定義, 存在すればfooの特異クラスのXを定義する.
>|4. 今のところ未定義
>|5. その他
>
>4です.どうするのが良いと思いますか?
>現行eval(private)では1ですね.
ですね.
>現行evalの基本は「そこにコードがそのままあった場合と同じ動き
>をする」ことです.しかし,そもそもメソッド定義と定数定義には
>存在できない場所がありますから,そういう場所でもevalの挙動は
>任意に決められるわけです.
>で,現状ではそのメソッドを定義している(定義を囲んでいる)クラ
>スをメソッド,定数の定義先としているわけです.
>で,考えられる変更点は
名前をつけますね.
[定義A]
> * evalをpublicにする
[定義B]
> * evalでのメソッドとクラスの定義先をクラスから特異クラスに
> 変更する.
>なんですよねえ.
うーん. そうですねえ...
まず, 元々の要求の元になったModule#evalの仕様はどうなっていたのか考え
てみましょう.
Foo.eval "Var = ..." -> Foo::Var
Foo.eval "class Bar; ...; end" -> Foo::Bar
Foo.eval "def foo; ...; end" -> Foo#foo
Foo.eval "@baz = ..." -> Fooのインスタンス変数
これって, 上記のどれに属するかを考えるとどれにも属していないんですよね...
これを[定義C]としましょう.
また, FooをClassのインスタンスと見て, [定義A]を適用すると::
Foo.eval "Var = ..." -> Class::Var
Foo.eval "class Bar; ...; end" -> Class::Bar
Foo.eval "def foo; ...; end" -> Foo.foo
Foo.eval "@baz = ..." -> Fooのインスタンス変数
とまりますよね? これはどう考えても使い物になりません.
つまり, FooをClassのインスタンスと見て, [定義B]を適用すると;;
Foo.eval "Var = ..." -> Foo.type::Var(Foo::Varではない!!)
Foo.eval "class Bar; ...; end" -> Foo.type::Bar(Foo::Barではない!!)
Foo.eval "def foo; ...; end" -> Foo.foo
Foo.eval "@baz = ..." -> Fooのインスタンス変数
となりますよね? 良く良く考えると, Module#evalとObject#evalは求めている
ことが全然違っているんですね...
また, 逆に, [定義C]を一般のオブジェクトにそのまま適用すると::
foo.eval "Var = ..." -> foo::Var (定義不能)
foo.eval "class Bar; ...; end" -> foo::Bar (定義不能)
foo.eval "def foo; ...; end" -> foo#foo (定義不能)
foo.eval "@baz = ..." -> fooのインスタンス変数
となります... 定義不能のところをどう解釈するかですが... それによって
[定義A], [定義B]になるんですね. foo::VarをFoo::Varとみるか?
Foo.type::Varと見るかによって...
さらに, 考えてみますと: eval系列を以下のように並べます(typeは特異クラ
スを返すとする).
foo.eval [定義A] or [定義B]
foo.type.eval [定義C]
Foo.eval [定義C]
Foo.type.eval [定義C]
こうやって並べてみますと, foo.evalは[定義B]のほうが望ましいのでは? と
いう気になってきますね. つまり,
定数定義 メソッド定義 インスタンス変数
foo.eval ? ? foo
foo.type.eval foo.type::X foo.bar foo.type
Foo.eval Foo::X Foo#bar Foo
Foo.type.eval Foo.type::X Foo.bar Foo.type
という感じになっていますので:
定数定義 メソッド定義 インスタンス変数
foo.eval foo.type::X foo.bar foo
foo.type.eval foo.type::X foo.bar foo.type
Foo.eval Foo::X Foo#bar Foo
Foo.type.eval Foo.type::X Foo.bar Foo.type
が一番美しいかなと... つまり, [定義B]ですね.
で, Module#evalでは [定義C]
さらに,
>| eval "def foo; ...; end"
>
>それはいくらなんでも使いにくいんで,Object#evalの挙動を変更
>するなら,main.evalを再定義して,トップレベルではObjectクラ
>スに対してメソッドや定数を定義するようにするでしょう,多分.
ですね. main.eval() は 上記の定義にしてもらうというのはいかがでしょう
か?
XXX.evalの定義が3種類になってしまいましたが....
こんな感じでいかがでしょう?
>|1. このまま.
>|2. メソッド定義は定数定義と合わせる.
>|3. 特異メソッドfooが定義されていれば, 特異メソッドの定義. 定義されてい
>| なければFoo#fooの定義. 特異メソッドを明示的に定義したい時には, def
>| obj.foo を用いる.
>なんか3は動きが複雑だなあ.定数メソッドともクラスにするか特
>異クラスにするかどちらかで統一した方が良さそうに思います.
ですかねえ.... 使う方も難しそうですねえ....
>|Object#typeは, 特異クラスを返した方がいいのか, あくまでもクラスを返し
>|た方がいいのか...
>
>なんとなく特異クラスを返そうという気になっています.
そうですか. それでは, さらに, MPF-APIのリクエストをします:
* Module#singuler?
そのクラスが, 特異モジュールかどうかの判断するメソッド.
* Module#normal_class
そのクラスが特異クラスだったら元のクラスを返す. normalクラスだったら
自分自身を返す.
* Object#normal_type
そのオブジェクトのnormalクラスを返す.
これらは, 以下のように使い分けるために使います.
foo.eval ... <- fooの特異クラスのアクセス
foo.type.eval ... <- fooのクラス(特異クラスか普通のクラスか未定)のアクセス
foo.normal_type ... <- fooのnormalクラスへのアクセス.
ところで, 特異クラスが見えるようになると, そのサブクラスも作れるように
なるんですかね?
現状ではどうかというと...
class Foo
def me
"Foo"
end
end
f = Foo.new
class << f
X = self
def bar
X
end
def me
"f.type"
end
end
X=f.bar
class Baz < X
end
b = Baz.new
print b.me
うーん. 定義できるみたいですねえ...
Foo > f.type > Baz
# なんだか, 話しが複雑だなあ...
__
..........................................石塚 圭樹@日本ラショナル...
----------------------------------->> e-mail: keiju@bc.mbn.or.jp <<---