Ruby 1.9 のイテレータ (ちょーすごい)
で、そんなことより Mochkit.Iter の Synopsis の例を Ruby でやろうとおもったらいろいろ足りない感じ
(Enumerator は http://subtech.g.hatena.ne.jp/secondlife/20071104/1194144583 でちゃんと紹介されているよ! )
theSum = sum(takewhile(
partial(operator.gt, 10),
imap(
partial(operator.mul, 2),
count()
)
)
));
assert( theSum == (0 + 0 + 2 + 4 + 6 + 8) );これこれ。
class Numeric
def countup
(self..(1.0/0)).to_enum
end
end
module Enumerable
def imap(&mapfun)
Proc.new {|&block|
self.each do |i|
block.call mapfun.call(i)
end
}.to_enum(:call)
end
end
# (sum はぬかしてる)
p 0.countup.imap {|x| x * 2}.take_while {|x| x < 10}imap はなんか適当に書いてみたらこうなってしまったんだけどもっと簡単にかけたりするのかな…… 演算子の partial は定義しないといけないのと、ブロック書いたほうがはやいのでとりあえずとばし
countup はもっと簡単に書けないかとおもったけど微妙にめんどいっぽい。id:secondlife さんにもきいた。
# Float になっちゃう
p 0.to_enum(:step, 1.0/0).take(10)
# みじかいけど 1.0/0 (Infinity) がわかりにくい
p (0..(1.0/0)).to_enum.take(10)
# ながいよ
p lambda {|x,&block| loop { block.call(x); x += 1 } }.to_enum(:call, 0).take(10)
# Float::MAX が無限っぽくない
p 0.to_enum(:upto, Float::MAX).take(10)