Files
pylisp/core/tail_recursion.py

23 lines
675 B
Python

from typing import Callable, Any
class tailRecursion:
"""Tail-call optimization wrapper."""
f: Callable[..., Any]
args: tuple[Any, ...]
kwargs: dict[str, Any]
def __init__(self, func: Callable[..., Any], *args: Any, **kwargs: Any) -> None:
self.f: Callable[..., Any] = func
self.args: tuple[Any, ...] = args
self.kwargs: dict[str, Any] = kwargs
def __call__(self) -> Any:
return self.f(*self.args, **self.kwargs)
@staticmethod
def eval(val: Any) -> Any:
"""Evaluate tail calls recursively until completion."""
while isinstance(val, tailRecursion):
val = val()
return val