from __future__ import annotations from enum import Enum from typing import Any, TYPE_CHECKING # from core.environment import Environment if TYPE_CHECKING: from core.environment import Environment class Lambda: """Lambda function with arguments, body, and closure environment""" args: Any body: Any env: Environment def __init__(self, args: Any, body: Any, env: Environment) -> None: self.args: Any = args self.body: Any = body self.env: Environment = env class Dambda: """Dambda function""" args: Any body: Any def __init__(self, args: Any, body: Any) -> None: self.args: Any = args self.body: Any = body class Macro: """Macro definition""" args: Any body: Any def __init__(self, args: Any, body: Any) -> None: self.args: Any = args self.body: Any = body class Pure(): """Pure definition""" args: Any body: Any def __init__(self, args: Any, body: Any) -> None: self.args: Any = args self.body: Any = body class BaseToken(Enum): """Base class for enumerations""" class SpecialForm(BaseToken): EVAL = "eval" IF = "if" DO = "do" PRINT = "print" READ = "read" SYMBOL = "symbol" DEF = "def" SET = "set!" FLUSH = "flush" PURE = "pure" LAMBDA = "lambda" DAMBDA = "dambda" MACRO = "macro" RAISE = "raise" QUOTE = "quote" CONS = "cons" CAR = "car" CDR = "cdr" TYPEOF = "typeof" class BinaryOperator(BaseToken): ADD = "_+_" SUB = "_-_" MUL = "_*_" DIV = "_/_" MOD = "_%_" STRCONCAT = "_++_" class BinaryPredicate(BaseToken): LT = "_<_" GT = "_>_" EQ = "_=_"