读书人

模拟兑现一个 Ruby 的 TCO

发布时间: 2012-11-01 11:11:32 作者: rapoo

模拟实现一个 Ruby 的 TCO
今天搜了一下,发现 ruby 只有一部分 VM 实现支持 TCO(Tail Call Optimization)。下面的代码模拟实现了一下,有点 clojure 的感觉了~~

class Recur  attr :args  def initialize(*args)    @args = args  endenddef 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, maxend# 设到 "0"*99999 我的机器就内存不够了p fib ("1" + "0"*100).to_i

读书人网 >Ruby Rails

热点推荐