In article <20021104160723.757540.eban / os.rim.or.jp>,
  WATANABE Hirofumi <eban / os.rim.or.jp> writes:

> 定義してない変数を参照したのでエラーになって当然だと思います。

現在の仕様において当然であることには同意します。実際そうなりますし。
でも、ここで述べているのはその仕様自体に不条理を感じるということです。

p v if v = (...)

でいえば、p v に達したときには、必ず v に代入されているのに、v が参照
できないということですし、

if xxx
  v = 1
else
  p v
end

でいえば、p v に達したときには、決して v に代入されていないのに、 v が
参照できるということです。

> > ついでにいえば、おそらく、この仕様
> > が良いという理由は存在しないんじゃないかと思っています。
> 
> 実行されようがされまいが、字面で静的に判断できるのですごく単
> 純という利点があります。

私も静的スコープは大好きです。その点はまったくもって同意します。

でも、ここの「良いという理由は存在しない」というので述べたかったのは現
在の仕様が制御の流れを無視している点です。単純に上から下に調べるのでは
なく、もう少し制御の流れを考慮してもいいんじゃないかと思うのです。

なお、「Java のように」というのは Java の definitive assignment のこと
なのですが、これもやはり静的に決まります。

> > なお、ブロックやループに関しては微妙な点があって「初期化されない可能性
> > がある」場合を全てエラーにするのは無理があるのも事実で、少し緩めたあた
> > りがおとしどころかもしれませんが。
> 
> それはそれで難しいルールになりませんか?

私が想定しているのは、if や case を除いて、だいたい今と同じような感じ
のルールです。

In article <200211040724.QAA14328 / sun204.rd.j-mac.co.jp>,
  SAITO Shukaku <shukaku / j-mac.co.jp> writes:

> eval( 'x = 2000' )
> p "#{ x }"          # これは表示できるのに...
> p x                 # こっちはエラーになります。
>                     # 文字列中の代入は実行時に解釈するからですが。

ちなみに、現在の 1.7 では両方エラーになります。
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)