Michele Simionato wrote: > CONTINUE = object() # sentinel value returned by iterfunc > > def tail_recursive(func): > """ > tail_recursive decorator based on Kay Schluehr's recipe > http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691 > """ > var = dict(in_loop=False, cont=True, argkw='will be set later') > # the dictionary is needed since Python closures are read-only > > def iterfunc(*args, **kwd): > var["cont"] = not var["cont"] > if not var["in_loop"]: # start looping > var["in_loop"] = True > while True: > res = func(*args,**kwd) > if res is CONTINUE: > args, kwd = var["argkw"] > else: > var["in_loop"] = False > return res > else: > if var["cont"]: > var["argkw"] = args, kwd > return CONTINUE > else: > return func(*args,**kwd) > return iterfunc
CONTINUE could be put inside tail_recursive, couldn't it? And to squeeze a little more speed out of it, var could be a list (saves a hash lookup). Cool decorator. Carl Banks -- http://mail.python.org/mailman/listinfo/python-list