108 lines
2.0 KiB
Python
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
|