import functools
import decimal
-from libraries.recipes import overloading
-from libraries.recipes import algorithms
+from util import overloading
+from util import algorithms
@overloading.overloaded
class Operation(object):
def __init__(self):
- self.base = 10
+ self._base = 10
def __str__(self):
raise NotImplementedError
+ @property
+ def base(self):
+ base = self._base
+ return base
+
def get_children(self):
return []
def __init__(self, value, base):
super(Value, self).__init__()
self.value = value
- self.base = base
+ self._base = base
def serialize(self, renderer):
for item in super(Value, self).serialize(renderer):
return self
def evaluate(self):
- raise KeyError
+ raise KeyError('Variable "%s" unable to evaluate to specific value' % self.name)
class Function(Operation):
def __init__(self, *args, **kwd):
super(Function, self).__init__()
+ self._base = None
self._args = args
self._kwd = kwd
- self.__simple = self.__simplify()
- self.__str = self.pretty_print(args, kwd)
+ self._simple = self._simplify()
+ self._str = self.pretty_print(args, kwd)
def serialize(self, renderer):
for item in super(Function, self).serialize(renderer):
for arg in self._args
)
+ @property
+ def base(self):
+ base = self._base
+ if base is None:
+ bases = [arg.base for arg in self._args]
+ base = bases[0]
+ assert base is not None
+ return base
+
def __str__(self):
- return self.__str
+ return self._str
def simplify(self):
- return self.__simple
+ return self._simple
def evaluate(self):
selfArgs = [arg.evaluate() for arg in self._args]
- return Value(self._op(*selfArgs))
+ return Value(self._op(*selfArgs), self.base)
- def __simplify(self):
+ def _simplify(self):
selfArgs = [arg.simplify() for arg in self._args]
selfKwd = dict(
(name, arg.simplify())
try:
args = [arg.evaluate() for arg in selfArgs]
base = self.base
- if base is None:
- bases = [arg.base for arg in selfArgs]
- base = bases[0]
result = self._op(*args)
node = Value(result, base)
except KeyError:
- node = type(self)(*selfArgs, **selfKwd)
+ node = self
return node
def __init__(self, *args, **kwd):
super(GenFunc, self).__init__(*args, **kwd)
- self.base = base
+ self._base = base
+ self._simple = self._simplify()
+ self._str = self.pretty_print(args, kwd)
_op = lambda self, n: n
_rep = Function.REP_FUNCTION