原です。

>正木です。

>class Sequence
>   def initialize(sequence_initilal_list=[],*sequence_parameter)
>     @proc=eval("proc{"+yield+"}")
>     @list=sequence_initilal_list
>     @para=sequence_parameter
>   end
>
>   def [](n)
>     @list[n] || @list[n]=@proc.call(n,*@para)
>   end
>
>に変更しておくことにします。
>まだ何か錯覚していると困るので確認したいのですが、上記の場合 block 内の
>変数は sequence_initilal_list,sequence_parameter 以外全て、ブロック内
>ローカル変数となると思って間違いないですか?

そうですね。後、変数名でなくメソッド名だと解釈される可能性はあります。

>|こちらの方はブロックでその変数を使用して良いかどうかローカルに決定でき
>|ません。もし foo がライブラリの関数であれば、そのソースコードを調べる
>|必要が出てきてしまいます。それが eval を避けたい理由の一つです。
>
>これはどういうことか良く理解できませんでした。できたら実例をあげて説明
>していただけますか?

いえこれは先の例の事です。結局 eval の中では何でもできるので、例えば
ローカル変数だけでなく、関数やクラスまで作れてしまうので、何をしでかす
かわからないということです。

>|メソッドの中だから、トップレベルだから、という違いは特にないでしょう。
>|メソッドの中でもローカル変数を延々と使い回せば状況はわかりにくくなるし、
>
>メソッドというのは短いものが多いのと、汎用性が要求され何回も呼ばれる
>ものなので、慎重に注意して書きますが(それでも上述したような見落としがあ
>ります)、トップレベルというのは、(私の場合だけかも知れませんが)頻繁に
>変更追加することが多く、その際 editor で切り貼りすることが多いのですが、そこ
>で変数名の衝突に気付かなければ、見付けにくい bug になり、気付いたとして
>も変数名の書き換えをするのが結構面倒です。

これは、それぞれの人の癖ですね。わたしはトップレベルのサイズってのは、
クラス/モジュールの定義を除いては、他のメソッドのサイズと変わらない
です。長くなると関数にしてしまう。トップレベルには関数一つ置くだけの
人もけっこういるみたいです。

>method というのは仕様さえ知っていれば、その実装は知らなくて良い筈です。
>例えば最初に書いた例の foo(x) の仮引数の x は本来なら dummy 変数のはず
>ですから、これが x か y かなんていうことはどうでもいいことの筈なのに
>現在の仕様ではそうなっていません。

確かに「任意のxについてP(x)」といったら、他のxと干渉しないというのが
常識なんで、その感覚は皆さん共有していると思います。でもけっこう難し
い問題かも。

>これは Object 指向の原則の一つ「情報隠蔽」に反しませんか?

うーん、でもこれは Object指向の問題の範囲外のような気がするなあ。