From: Yukihiro Matsumoto Date: 2007-08-24T15:48:44+09:00 Subject: [ruby-dev:31634] Re: Fiber reviesed まつもと ゆきひろです In message "Re: [ruby-dev:31620] Re: Fiber reviesed" on Thu, 23 Aug 2007 12:50:43 +0900, "Yusuke ENDOH" writes: |next_iter のように多値を返すのは私もあまり良くないと思います。 |Xtal の場合は、通常のブロック呼び出しが next_iter などの呼び出しの |シンタックスシュガー扱いらしいので、スピードを無視できないんだと思います。 まあ、市橋さんはスピード狂みたいですからねえ。Pythonは同様の 仕掛けで例外を使ってます。 |Ruby の場合は C# の IEnumerator で実装されているという MoveNext と |Current のインターフェイス (だと言われているもの) が良いと思います。 |メソッド名は長すぎるので、それぞれ next と value なんてどうでしょうか。 | | - next : 次の要素まで進み、進めたら真を返す、さもなくば偽を返す。 | - value : 現在の要素を返す nextとvalueの両方のメソッドを使わなくちゃいけないという点が イケてない気がします。次々と要素を取り出して期待だけなのに いちいち事前に「まだ読めますか」と聞かなくちゃいけないのが気 に入らない。 じゃあ、どうするかというとPython方式が良いんじゃないかと思い ます。つまり、nextだけ呼んで、末尾に来たらStopIteration例外が 起きるので、それを捕捉するという。例外コストが気になりそうで すが、目の前にいるささだ先生に確認したところ、ほとんど問題な いだろうとのことでした(まあ、現状(next?)よりちょっと重いので、 スピード狂的にはイヤそうでしたけど)。 さらに前田(修吾)くんの思いつきによる「loopがStopIteration例 外を捕捉する」というアイディアをたすと、まるで懐かしのSather のように e = [1,2,3,4,5].each loop do p e.next end のようなことができるようになります。素敵。 で、手元ではコーディングできちゃったんで、これからコミットし ようかなあ、と。反対するなら今のうち。 まつもと ゆきひろ /:|)