正木です。

In message "[ruby-math:00403] Re: class Real"
    on 01/03/14, Shin-ichiro HARA <sinara / blade.nagaokaut.ac.jp> writes:

|いらっしゃいませ。文字化けはすっかり直りましたね。(^^

nif.rb-0.91を使っています。
引用のとき行頭に不等号を置くとその付近で
文字化けが起きるようなので nifty 特有の問題かも
知れません。
引用の仕方を変えたら起こらなくなりました。

|今のコードは String オブジェクトを eval して Proc オブジェクトを作
|り、それを call してますよね。eval することと、call することは似た
|ところがあり、何か同じことを2重にしてしまっている気がします。

これはうまい回避策が見付かりませんでした。

|Sequence.new(list){"|x| f(x)"}
|
|Sequence.new(list){"|t| f(t)"}
|で違う結果を得る可能性がありますよね。

これは無いとおもいます。
ローカル変数の scope についてまだ誤解しているといけませんので
確認させてください。

#その変数がブロック開始以前に未定義ならば
#スコープがブロック内部に限られる。
#定義されていれば
#変数のスコープはブロック内部に限られない。


これをうっかりして随分痛い目に会いました。
main で block を使うと ローカル変数がある意味で大域変数になり得ると
いうことなので、このことに気付いてから main の context の中では
できるだけ block を使わない事にしています。
変数の scope がそれ以前の code を全部調べないと分からないというのは
困りませんか?
とは言っても initialize に渡した block はどこで評価されるかわからない
ので、そのための苦肉の策が文字列だったわけです。文字列ならどこで評価
されても変わりませんから。

しかし一方では
# method 定義の中ではローカル変数は、本当に local

ですから、initialize method の最初に評価しておけば、上記の心配は無いはず
です。

例えば Power の定義の中で block(文字列)内の n,x は dummy 変数ですから
def (Power={}).[](x)
  super || Power[x]=Sequence.new([1],x){"|k,s| s*self[k-1]"}
end
のように書いても全く問題はありません。

もう少し危険そうな
x=1
for n in 0..3
p (Sequence.new([1],x){"|n,x| x+=2*n;x*self[n-1]"}[n])
end
のような場合でも、外部の x,n とは無関係です。

block 内の変数の scope についての現在の仕様がどうしても納得できない
ので教えて下さい。

#   block 内で未定義の変数以外は全てブロック内ローカル変数とする。
#   外部変数を使いたい時には block 内で未定義で使う。

という仕様にした方が block の中を見ただけで変数の scope が分かって
すっきりするし、使いやすいと思います。
このような仕様にした時にどうしても困るのはどういう場合でしょうか?
私が思い付くのは、例えば現在の仕様では次のように書ける script 
  def find
    x=nil
    each{|x| break if yield(x)}
    x if yield x 
  end
が上記の仕様だと
  def find
    r=nil
    each{|x| r;if yield(x) then r=x;break;end}
    r
  end
の様に書かなくてはいけないことになります。
ここで block 中の r; は r を block の中で無定義にするためだけに必要になるので
無駄と言えば無駄ですが、これは r が外部変数だと言うことの宣言文と
思えば我慢できないことではないと思いますが、如何でしょうか?
この程度の demerit だったら merit に比べれば無視できる程度の物に思えます。


|Real = Sequence

これは気が付きませんでした。有難うございました。