diff --git a/src/jasinta.py b/src/jasinta.py --- a/src/jasinta.py +++ b/src/jasinta.py @@ -1,4 +1,4 @@ -from std import lib as stdlib +from std import lib as stdlib, Number class Undefined: @@ -10,12 +10,14 @@ def evaluate(node, context): return None node_type = node["type"] + # retrieve an already existing object from the context if node_type == "Identifier": for ctx in reversed(context): if node["name"] in ctx: return ctx[node["name"]] return Undefined + # create a new object cls = node_index[node_type] obj = cls(node) return obj.eval(context) @@ -69,7 +71,7 @@ class BinaryExpression: # in fact this doesn't follow JavaScript "+" semantics if self.node["operator"] == "+": - return left+right + return Number(left.val+right.val) else: raise NotImplementedError @@ -110,7 +112,15 @@ class Literal: self.node = node def eval(self, context): - return self.node["value"] + val = self.node["value"] + + if isinstance(val, float): + if int(val) == val: + return Number(int(val)) + else: + return Number(val) + else: + raise NotImplementedError node_index = {cls.__name__: cls for cls in [