けいじゅ@日本ラショナルソフトウェアです. In [ruby-list :04234 ] the message: "[ruby-list:4234] Re: prime generator sample program ", on Sep/09 15:29(JST) toyofuku / juice.or.jp writes: > 豊福@パパイヤです。 > オブジェクト指向のサンプルプログラムの定番のよう >ですね。KL1版と C++版を見たことがあります。今回のは >C++版の ruby への焼き直しです。 オブジェクト指向というよりもストリーム処理ということでは有名みたいです ね. 探してみたら, エーベルマン・サスマンの``プログラムの構造と実行''の 中のストリームの項にものっていました. >> # 実は, mathn.rbのために, 同じものをruby版も作ったんですが, あまりにも >> # 遅いので, mathn.rb では別のアルゴリズムを採用してしまいました(^^;;; > > メソッド呼び出しに時間かかるんですかね。 それもあるかも知れませんが, それ以上にオブジェクト生成のコストでしょう ね. 素数の数だけオブジェクトを生成しちゃいますので... # でも, そんなこと気にするならCで書けという話しもありますが... 一応, # ruby推進者としては, ruby以外の実装は極力避けるべきであると考えていま # すので... # 仕事では, C++やっているので(Cも)使いたくないという噂もないではないで # すが(^^;;;; >> # 別にオブジェクト指向していませんが, アルゴリズムが面白いと思うので興 >> # 味があったら覗いてみて下さい. > はい読みました。mathn.rb の class Prime を見て >今回のプログラムを思い出した次第です。 > math.rb についてはいくつか質問がありますがそれは >また別メールにて。 はいはい. いろいろと問題点もあるのは認識していますがお手やらわかに (^^;;;; >自動的に collect とか find も使えるようになるのですね。 そうです. そうです. > なるほど勉強になりました。こういうことがサンプル >プログラムとともに書いてあるドキュメントがあると >いいですね。 いや. 本当は今頃本が出ていたはずなんですけどねぇ.... その中ではちゃん と書いてあることになっています(^^;;; >> # ただ, loopは無限に続くので途中で確実に止まることが保証されていないと... > > この後は何が続くのでしょう。 >・「無限ループになったらあきらめろ」 >・「だから確実に止まるように気をつけろ」 >・「だからこれこれの技を使え」 2番目ですね. 通常のストリームの場合は, nextを実装することによっていろいろの機能が付 加されるんですが, それとは違い, Enumeratableのeachは最後まで繰り返そう としますので, 無限に生成するストリームに対して, Enumeratableをインクルー ドするのは無理がないでもないですね. > アドバイスを基にしてプログラムを書き直しました。 >どうでしょう。 (中略) おお. 以前のプログラムは loop doが結構あって気にならなくもなかったので すが, そこがイテレータに置き換わっていてよりruby(?)らしくなっています ね(^^;;; もう少し意見をいわせてもらうと, 1. Streamはクラスでなくてモジュールにすることもできる. 2. FilterやCounterはそれ自身で利用できるクラスではないので, Sieveのロー カルクラスにすることもできる. 以下のような感じですね: module Stream ... end class Sieve include Stream class Filter include Stream ... end class Counter include Stream ... end ... end 1について解説すると, Streamクラスはクラスにしておくにはもったいない(?) からです. rubyでは, スーパークラスは1つしか持てません. 一方モジュール は複数インクルードできますので, 抽象クラスになるものはモジュールにでき るかどうか検討する価値はあると思います. 話しを進める前に1つだけ: * ライブラリとして使うには, Stream#out はいただけない. outという名前は深い意味があるのでしょうか? もしそうじゃなければ, もう ちょっと適当な名前に変えた方がよいかも知れません. 良く使う名前としては nextがありますが, rubyではnextは予約語(になる予定)なので使えません. こ こでは, Stream#succ(essor) という名前にしたとしましょう. Streamモジュールをインクルードするモジュール(クラス)は, メソッドsuccが 定義されていれば, Streamの機能を利用できるようになるわけですね. 今のところ, Stream#each(とEnumeratableの機能)が利用できるようになるだ けですが, もう少しメソッドを用意すればより利用価値の高いものになりますね. # Streamジュールは, これだけでもちゃんとしたモジュールライブラリになっ # ていますけどね(^^;;;; __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju / bc.mbn.or.jp <<---