Ruby で遅延評価メモ

 

意味なし

# Lazy Object
class LO < Object
  def initialize(&bl)
    @ob = bl
    @f = false
  end
  attr_reader :f, :result
  
  def force
    raise "error" if @f
    @f = true
    @result = @ob.call
    @ob = nil
    self
  end
  
  def get
    @f ? @result : self
  end
  
  def inspect
    @f ? "#<:#{@result}>" : "#<LO:#{@ob.inspect}>"
  end
  
  def method_missing(name, *args)
    fl = true
    loop = ->(ary) {
      x, xs = ary.first, ary.drop(1)
      return if xs.empty?
      fl = false unless x.f
      loop.(xs)
    }
    loop.([self] + args)
    if fl
      args = args.map(&:result)
      a = result.__send__(name, *args)
      LO.new{a}.force
    else
      nil
    end
  end
end

# Lazy Method
class LM

end

module Kernel
  def LO(a)
    LO.new{a}
  end
  module_function :LO
end

 

def fib(n)
  return LO(0).force if n == 0
  return LO(1).force if n == 1
  fib(n - 2) + fib(n - 1)
end

p fib(4)    #=>"#<:3>"