Files
centvrion/centvrion/values.py
2026-04-01 14:45:48 +02:00

108 lines
2.0 KiB
Python

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