diff options
Diffstat (limited to 'interpreter.py')
| -rw-r--r-- | interpreter.py | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/interpreter.py b/interpreter.py index 4adb972..e888944 100644 --- a/interpreter.py +++ b/interpreter.py @@ -1,4 +1,4 @@ -from parser import Expr +from structs import Literal, Symbol, List class Function: @@ -21,7 +21,6 @@ class Builtin(Function): def call(self, expr, env): if self.arities is not None and len(expr.args[1:]) not in self.arities: - #if self.arity >= 0 and len(args) != self.arity: fmt = f"[{self.arities[0]}" for arity in self.arities[1:]: fmt += f", {arity}" @@ -38,7 +37,7 @@ class UserFunction(Function): this_env = Environment(env) for idx, param in enumerate(self.params): # TODO this is wrong!!! this won't always be a literal - this_env.register(param.name, Expr.Literal(evaluate(expr.args[idx+1],env))) + this_env.register(param.name, Literal(evaluate(expr.args[idx+1],env))) return interpret(self.body, this_env) class Environment: @@ -81,15 +80,14 @@ def interpret(exprs, env=GLOBALS): return ret def evaluate(expr, env): - if isinstance(expr, Expr.Literal): + if isinstance(expr, Literal): return expr.value - elif isinstance(expr, Expr.Symbol): + elif isinstance(expr, Symbol): if not env.contains(expr.name): raise Exception(f"no such symbol: {expr}") return evaluate(env.get(expr.name), env) - #name = expr.symbol.name - if not isinstance(expr.args[0], Expr.Symbol): + if not isinstance(expr.args[0], Symbol): raise Exception("can't evaluate without a symbol") name = expr.args[0].name if name == "def": @@ -234,7 +232,7 @@ def interpretPrint(symbol, args, env): GLOBALS.register("print", Builtin(interpretPrint, 1)) def interpretDef(symbol, args, env): - if not isinstance(args[0], Expr.Symbol): + if not isinstance(args[0], Symbol): raise Exception("'def' requires a string literal as a name") name = args[0].name # NOTE: we are not evaluating the name!! if not isinstance(name, str): @@ -285,7 +283,7 @@ def interpretForCount(symbol, args, env): new_env = Environment(env) ret = None for idx in range(0, num): - new_env.register("idx", Expr.Literal(idx + 1)) + new_env.register("idx", Literal(idx + 1)) for arg in args[1:]: ret = evaluate(arg, new_env) return ret @@ -300,7 +298,7 @@ def interpretPipe(symbol, args, env): for arg in args: if pipe is not None: new_env.register("items", pipe) - pipe = Expr.Literal(evaluate(arg, new_env)) + pipe = Literal(evaluate(arg, new_env)) return pipe GLOBALS.register("|", Builtin(interpretPipe)) @@ -322,7 +320,7 @@ def interpretFunc(symbol, args, env): # func <name> (args) (exprs) if len(args) < 3: raise Exception("'func' takes a name, arguments, and at least one expression") - if not isinstance(args[0], Expr.Symbol): + if not isinstance(args[0], Symbol): raise Exception("'func' requires a string literal as a name") name = args[0].name # NOTE: we are not evaluating the name!! |
