Pythonで末尾再帰もどき

不快指数が高いのでむしゃくしゃしてやった。
とくに(スタックがあふれないという以上の)意味はありません

class TailRec(object):
    class TailRecException(Exception):
        def __init__(self,*args,**kwargs):
            self.args=args
            self.kwargs=kwargs
    def __init__(self,fnc,loopmax=100):
        self.fnc=fnc
        self.loopmax=loopmax
    def __call__(self,*args,**kwargs):
        for i in xrange(self.loopmax):
            try:
                ret=self.fnc(self,*args,**kwargs)
            except self.TailRecException,e:
                args=e.args[:]
                kwargs=e.kwargs
        return ret
    def reccall(self,*args,**kwargs):
        raise self.TailRecException(*args,**kwargs)
    
if __name__=="__main__":
    #フィボナッチ数列
    fib=TailRec((lambda self,n,x1,x2:
                 self.reccall(n-1,x2,x1+x2) if
                     (n>0)
                 else x2
                 ))
    for i in xrange(1,10+1):
        print "fib",i,fib(i,0,1)
        
    print 

    # 階乗
    fac=TailRec((lambda self,n,y:
                 self.reccall(n-1,y*n) if
                     (n>0)
                     else y
                 ))
    for i in xrange(1,10+1):
        print "fac",i,fac(i,1)
        


以前書いたデコレータ版
http://boxheadroom.com/2009/06/15/py_rec_self


今回はクラスにしたので、1行で書けるしlambdaも使える
何か使いどころ無いかなーと思いつつ、一度も使ったことない