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

In [ruby-list :04206 ] the message: "[ruby-list:4206] prime generator
sample program ", on Sep/08 19:52(JST) toyofuku / juice.or.jp writes:

>  豊福@パパイヤです。一から ruby 勉強中です。

>  オブジェクトを使ったちょっと面白いプログラムを
>思い出したので練習問題がてらに ruby で書いてみま
>した。チェーン状につながったフィルタオブジェクト
>を通すと合成数はふるい落とされていくというプログ
>ラムです。

この題材は, 昔, 本の中で書いた例題(Smalltalkで記述)と基本的に同じもの
だなと懐かしくなりました(^^;;;

# 実は, mathn.rbのために, 同じものをruby版も作ったんですが, あまりにも
# 遅いので, mathn.rb では別のアルゴリズムを採用してしまいました(^^;;;
# 別にオブジェクト指向していませんが, アルゴリズムが面白いと思うので興
# 味があったら覗いてみて下さい. 

>  「こう書いた方が ruby らしい」など教えて下さい。

そうですね. まず, Enumeratableをincludeすることを考えると面白いと思い
ます(Sieve#eachを実装する)そうすると,

primes = Sieve.new(c)
for n in primes 
  break if n > max
  print n, "\n"
end

などの使い方ができるようになります. 

# ただ, loopは無限に続くので途中で確実に止まることが保証されていないと...

数えあげられるもの(Stream系)に関しては, Enumeratableをincludeできるか
まず考えるとよいでしょう.

次に個別なことですが, 気になったところを1つだけ:

>class Counter

(中略)

>if ! max = ARGV.shift; max = 100; end
>max = max.to_i
>
>c = Counter.new(2)
>s = Sieve.new(c)

この辺りが美しくないですよね. cはSieve内部で使うものですからSieve.new
の内部で設定したらいかがでしょう?

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