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))