`
yangdong
  • 浏览: 65028 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

模拟实现一个 Ruby 的 TCO

阅读更多
今天搜了一下,发现 ruby 只有一部分 VM 实现支持 TCO(Tail Call Optimization)。下面的代码模拟实现了一下,有点 clojure 的感觉了~~
class Recur
  attr :args
  def initialize(*args)
    @args = args
  end
end

def def_recur(fn_name, &block)
  def recur(*args)
    Recur.new *args
  end
  mtd = lambda do |*args|
    loop do
      ret = block.call *args
      return ret if not ret.instance_of? Recur
      args = ret.args
    end
  end
  self.class.send(:define_method, fn_name.to_sym, mtd)
end

# Fibonacci 数列
def fib(max)
  def_recur :_fib do |ret, a, b, max|
    return ret if a > max
    ret << a
    recur ret, b, a+b, max
  end
  _fib [], 0, 1, max
end

# 设到 "0"*99999 我的机器就内存不够了
p fib ("1" + "0"*100).to_i
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics