仮想的な無限列(1)

フィボナッチ数列を題材に考えてきたことをSequenceというクラスにまとめてみました。仮想的な無限列です。誰かがどこかでやっていると思いますが、自分の勉強の成果として。

class Sequence < Proc
  def car(*args)
    args[0]
  end
  def cdr(*args)
    call(self, *args)
  end
  def define(*a)
    lambda { return self.car(*a), self.cdr(*a) }
  end
end

# Natural numbers
natural = Sequence.new {|f, a| f.define(a + 1)}
n = natural.define(0)
20.times do
  x, n = n.call()
  print x, " "
end
puts
#=> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

# Fibonacci numbers
fibonacci = Sequence.new {|f, a, b| f.define(b, a + b)}
fib = fibonacci.define(1, 1)
20.times do
  x, fib = fib.call()
  print x, " "
end
puts
#=> 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765