from abc import ABC, abstractmethod from fractions import Fraction from centvrion.errors import CentvrionError class Val(ABC): @abstractmethod def value(self): ... def __repr__(self): return f"{self.__class__.__name__}({self.value()!r})" def __eq__(self, other): return isinstance(other, type(self)) and self.value() == other.value() class ValInt(Val): def __init__(self, v: int): assert isinstance(v, int) and not isinstance(v, bool) self._v = v def value(self): return self._v def __bool__(self): return self._v != 0 def __lt__(self, other): return self._v < other.value() def __gt__(self, other): return self._v > other.value() class ValStr(Val): def __init__(self, v: str): assert isinstance(v, str) self._v = v def value(self): return self._v def __bool__(self): return self._v != "" class ValBool(Val): def __init__(self, v: bool): assert isinstance(v, bool) self._v = v def value(self): return self._v def __bool__(self): return self._v class ValList(Val): def __init__(self, v: list): assert isinstance(v, list) self._v = v def value(self): return self._v def __bool__(self): return len(self._v) > 0 def __iter__(self): return iter(self._v) class ValFrac(Val): def __init__(self, v: Fraction): assert isinstance(v, Fraction) self._v = v def value(self): return self._v def __bool__(self): return self._v != 0 def __lt__(self, other): return self._v < other.value() def __gt__(self, other): return self._v > other.value() class ValNul(Val): def value(self): return None def __bool__(self): raise CentvrionError("NVLLVS cannot be evaluated as a boolean") class ValFunc(Val): def __init__(self, params: list, body: list): self._params = params self._body = body def value(self): return (self._params, self._body) @property def params(self): return self._params @property def body(self): return self._body