けいじゅ@日本ラショナルソフトウェアです.

In [ruby-dev :16592 ] the message: "[ruby-dev:16592] Re: defined? 
autoload constant ", on Mar/26 01:13(JST) Yukihiro Matsumoto writes:

>まつもと ゆきひろです

>|まだ, ちょっとおかしいみたい.
>|
>|ruby 1.6.7 (2002-03-25) [i686-linux]
>|
>|irb(main):007:0> def foo; p 1; 1; end
>|irb(main):008:0> def bar; p 2; 2; end
>|irb(main):010:0> defined?((foo+bar))        #(1)
>|1
>|"method"
>|irb(main):017:0> defined?(foo+(bar+foo))     #(2)
>|1
>|2
>|"method"
>|
>|(1)はexpressionで, (2)はbarを評価するのはおかしいのでは?
>
>(1)はmethodでしょう。+もメソッドだから。かっこは構文解析の段
>階で消えてしまっています。

以前(今回の修正前まで)は, expressionでしたが, そっちがおかしい?

>(2)は「barを呼ぶのはおかしいではないか」ということだと思うの
>ですが、現状では実は引数に対しても再帰的にdefined?を適用して
>るからです。やりすぎか。

たぶん. というのも, 

# foo定義していない.
irb(main):002:0> defined?(1+foo)
nil
irb(main):003:0> defined?(1+(foo+bar))
nil
irb(main):004:0> def foo; p 1; 1; end
nil
irb(main):005:0> defined?(1+foo)
"method"
irb(main):006:0> defined?(1+(foo+bar))
1
nil
irb(main):007:0> bar = "a"
"a"
irb(main):008:0> defined?(1+bar)
"method"

fooが定義されていないと 1+foo がnilなのは, 何か変な気がしないでもない.

fooが定義されれば, 1+fooがexpressionになるならわからんでもないけど,
methodなんでしょ. そうすると, fooが定義されると、1+fooがメソッドとして定
義される? 

__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---