News for hackers. Stuff that matters.
Re:Functional Python Programming by linkdd on Friday June 09, 2023 @10:29AM (#36258340)
For tail recursion, you can use this snippet of code:

  class Recurse(Exception):
      def __init__(self, *args, **kwargs):
          self.args = args
          self.kwargs = kwargs
  
  class Terminate(Exception):
      def __init__(self, retval):
          self.retval = retval

  def tailrec(func):
      def wrapper(*args, **kwargs):
          while True:
              try:
                  func(*args, **kwargs)

              except Recurse as r:
                  args = r.args
                  kwargs = r.kwargs

              except Terminate as t:
                  return t.retval

      return wrapper

  @tailrec
  def fact(n, acc=1):
      if n == 0:
          raise Terminate(acc)

      else:
          raise Recurse(n - 1, acc * n)
Of course, it will be slow because it relies on exceptions :P
Re:Functional Python Programming by _aavaa_ on Friday June 09, 2023 @12:56PM (#36260670)
You can do a similar thing (that's around 2-3x faster) with a trampoline:

  def factorial(n):
      res = fac(n)
      while callable(res):
          res = res()

      return res

  def fac(n, acc=1):
      if n == 1:
          return acc
      else:
          return lambda: fac(n-1, n*acc)