aboutsummaryrefslogtreecommitdiff
path: root/interpreter.py
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter.py')
-rw-r--r--interpreter.py20
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!!