原です。

>正木です。
>原 信一郎様、御教示有難うございます。
>"Ruby プログラミング入門" は分かりやすくて、愛読しています。

ありがとうございます。

>ただ DelayedList の所は理解するのに苦労しました。

あそこは唐突に難しくなっているので、今「正木−青木」による Sequence
の例を、あの前に紹介すべきだったと後悔しています。改訂の時は入れまし
ょう。

>(ほかには問題の instance_eval)

instance_eval についてはほとんど解説しませんでした。これも手落ち。

>これは私の script で $mod=2 としたものと本質的には同じものだと造もいますが、
>break 行の 100 を m に変えると意図通りには動きません。
>これは致命的な欠陥だと思って採用しなかったわけです。
>Prime の定義のなかでの m は本来 dummy(他の変数名とぶつからなけku
>何を使ってもいい)変数の筈なのに、この場合はこの block が mai
>n の
>context で評価されるため dummy になりません。
>こういう場合は他では絶対に使わないような変数名を使いなさいという
>解決策は、Programming の基本に反する(dummy は dummy であku驍ラきだ
>いう意味で)と思うので受け入れられません。

なるほど。(所々文字化けしているので適当に想像して返事します。)
ブロックを関数のオブジェクト化だと思って使うと、ここが気持ち悪いですね。
確かにその通りです。これについてはこの ML でも何度か話題になったと思い
ます。

>第2引数の必要性についてですが、……
>
>p (Prime*Power[2])[m]
>
>とやれば当然 error になります。

これは Prime*Power[2] が p の引数と解釈されているからです。(「入門」
の p.75 にも少し解説しましたが。) p() の戻り値 nil に [] が施されて
います。


さて、ローカル変数をブロックに限定して使うことは instance_eval をも
ってしてもできません。ここはやはり関数を定義してそれを渡すしかないで
しょう。

class Sequence

    include Enumerable

    def initialize( list, &block )
      @list = list
      @proc = block
    end

    def []( n )
      @list[n] ||= @proc.call( self, n )
    end

    def each
      i = 0
      loop do
        yield self[i]; i += 1
      end
    end

    def *(y)
      x=self
      Sequence.new([]){|seq,n| x[n]*y[n]}
    end

end

m = ARGV[0].to_i

def (Power = {}).[]( x )
    super || Power[x] = Sequence.new([1]) {|seq, n| x * seq[n-1] }
end

def self.sieve(seq, n)
   m = seq[n - 1] + 2
   m += 2 while seq.find{|k|
     break if k * k > m
     m % k == 0
   }
   m
end

Prime = Sequence.new([2,3], &method(:sieve))

p((Power[2]*Prime)[m])

ここでは method で Method オブジェクトを生成して、それを渡していますが、
あっさり :sieve をシンボルとしてそのまま渡して send して使うのも軽くて
いいかと思います。

でも sieve というメソッド名の痕跡がトップレベルの self 内で干渉するので、
あおきさんなら、

Prime = Sequence.new([2,3], & Object.new.instance_eval{
                        def sieve(seq, n)
                          m = seq[n - 1] + 2
                          m += 2 while seq.find{|k|
                            break if k * k > m
                            m % k == 0
                          }
                          m
                        end
                        self}.method(:sieve))

とここまでやるかもしれません。(^^;

なお、この一時的な環境のための instance_eval の利用法は

http://www1.u-netsurf.ne.jp/~brew/mine/ja/ruby/iter.html

にあります。因みに、さまざまな動的な手続きの利用法のコレクションが

http://blade.nagaokaut.ac.jp/~sinara/ruby/rubynyumon-2000/programing1.html

にあります。参考になるかも。(ならないかも。)


>無限数列や級数に使うのが主な目的なのでこれが出来ないと使い物になりま
>せん。(Cauchy 列または級数として実数そのものを表す Real class kul
>ていますが実行速度に問題があり実用的なものは未だ出来ません。)

特定の数を表現する Cauchy 列を作ることはできるでしょうが、一般には
例えばある数列が Cauchy 列であるか否かを答える述語の様なものは作れ
ないのではないと思います。

>これは便利だと思ってくれた人が一人もいなかったのがちょっと残念だった
>ので、最後に使用例を少しだけ:

いえ、大変興味深いです。数そのものではなく、数を求めるアルゴリズムを計算
対象とすることで、無限精度の計算ができますね。

数学がからんでくるお話なら是非 ruby-math へお越しください。