Python のデコレータとインスペクトで末尾再帰のループ展開

id:Kazumi007:20090914:1252915940 とかを参考にしながらやってみた
(追記)あきらかにおかしいわこれ...
(追追記) id:metanest:20110221:1298253743 が修正版

import inspect

class Thunk(object):
  def __init__(self, f, v):
    self.func = f
    self.args = v

  def force(self):
    return self.func(*self.args)

def loop_ex(func):
  def ex_func(*args):
    framerecords = inspect.stack()
    framerecord = framerecords[1]
    try:
      frame = framerecord[0]
      arginfo = inspect.getargvalues(frame)
      binds = arginfo.locals
    finally:
      del frame
    if isinstance(binds.get('self'), Thunk):
      return Thunk(func, args)
    else:
      c = Thunk(func, args)
      while isinstance(c, Thunk):
        c = c.force()
      return c
  return ex_func

@loop_ex
def fact(n, acc):
  if n > 0:
    return fact(n - 1, acc * n)
  else:
    return acc

print(fact(5, 1))