From: Yusuke ENDOH Date: 2007-08-24T19:39:13+09:00 Subject: [ruby-dev:31636] Re: Fiber reviesed 遠藤です。 > |next_iter のように多値を返すのは私もあまり良くないと思います。 > |Xtal の場合は、通常のブロック呼び出しが next_iter などの呼び出しの > |シンタックスシュガー扱いらしいので、スピードを無視できないんだと思います。 > > まあ、市橋さんはスピード狂みたいですからねえ。Pythonは同様の > 仕掛けで例外を使ってます。 なるほど。 > | - next : 次の要素まで進み、進めたら真を返す、さもなくば偽を返す。 > | - value : 現在の要素を返す > > nextとvalueの両方のメソッドを使わなくちゃいけないという点が > イケてない気がします。次々と要素を取り出して期待だけなのに > いちいち事前に「まだ読めますか」と聞かなくちゃいけないのが気 > に入らない。 それは next? でも同じだと思います。 > じゃあ、どうするかというとPython方式が良いんじゃないかと思い > ます。つまり、nextだけ呼んで、末尾に来たらStopIteration例外が > 起きるので、それを捕捉するという。例外コストが気になりそうで > すが、目の前にいるささだ先生に確認したところ、ほとんど問題な > いだろうとのことでした(まあ、現状(next?)よりちょっと重いので、 > スピード狂的にはイヤそうでしたけど)。 おお。その方法で問題がないならそれが一番綺麗ですね。 効率はどうでもいいのですが、あえてインネンをつけるなら…… 1. 例外捕捉のためにインデントが増えるのがイヤ 2. 他の例外を捕捉するつもりで書いた rescue に引っかかってバグのもと 3. 例外的でない事象を表現するのに例外を使うのが少し後ろめたい 4. 個人的に rescue の構文の見た目が好きくないので書きたくない > さらに前田(修吾)くんの思いつきによる「loopがStopIteration例 > 外を捕捉する」というアイディアをたすと、まるで懐かしのSather > のように > > e = [1,2,3,4,5].each > loop do > p e.next > end > > のようなことができるようになります。素敵。 Sather は知りませんし実際の利便性はどうかわかりませんが、上の例は かっこいいですね。rescue しなくていいし。 break は実は「文法的な制限のある raise StopIteration」なのではないか、 などと感じてしまいました。 -- Yusuke ENDOH