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, Number +from std import lib as stdlib, Number, String class Undefined: @@ -12,6 +12,9 @@ def evaluate(node, context): node_type = node["type"] # retrieve an already existing object from the context if node_type == "Identifier": + if hasattr(context[-1], node["name"]): + return getattr(context[-1], node["name"]) + for ctx in reversed(context): if node["name"] in ctx: return ctx[node["name"]] @@ -68,7 +71,10 @@ class AssignmentExpression: def eval(self, context): left = evaluate(self.node["left"], context) right = evaluate(self.node["right"], context) - if self.node["operator"] == "+=": + op = self.node["operator"] + if op == "=": + left.val = right.val + elif op == "+=": left.val += right.val else: raise NotImplementedError @@ -84,7 +90,7 @@ class BinaryExpression: # in fact this doesn't follow JavaScript "+" semantics if self.node["operator"] == "+": - return Number(left.val+right.val) + return left+right else: raise NotImplementedError @@ -133,7 +139,7 @@ class Literal: else: return Number(val) else: - raise NotImplementedError + return String(val) node_index = {cls.__name__: cls for cls in [