fugafuga.write

日々のログ

Rubyで遅延評価

Procにする

proc_call.rb

def add(n, acc = 0)
  return acc if n == 0
  Proc.new { add(n - 1, acc + n) }
end

def lazy_call(val)
  while val.instance_of?(Proc)
    val = val.call
  end
  val
end

p lazy_call(add(100000000))

実行

irb(main):001:0> require './proc_call.rb'
5000000050000000
=> true

Enumerator::Lazyを使う

docs.ruby-lang.org

しょかん

遅延評価、末尾呼び出し最適化などはちゃんとまとめておきたい