aboutsummaryrefslogtreecommitdiff
path: root/runner.py
diff options
context:
space:
mode:
authormryouse2022-05-10 02:46:42 +0000
committermryouse2022-05-10 02:46:42 +0000
commit3e70f2ce47ee954640df9ee3b432964c1111b5ed (patch)
tree0ed1155e401b1768adc0fd537721b5a75749e1c0 /runner.py
parent7bed8de9b493ca2a2b13d6293db6bd81b73325ce (diff)
refactor: std to own file, implement 'exit', multiple sigs
Diffstat (limited to 'runner.py')
-rw-r--r--runner.py29
1 files changed, 9 insertions, 20 deletions
diff --git a/runner.py b/runner.py
index a2c7e99..8e4f86d 100644
--- a/runner.py
+++ b/runner.py
@@ -1,15 +1,6 @@
from tokens import *
+from std import STD
-def std_print(arg):
- print(arg.value)
- #return [] # TODO this should return empty list
- return NebLiteral(NebType.BOOL, True)
-
-std = {
- "print": {
- "func": NebFunction("print", [NebType.STRING], NebType.BOOL),
- "impl": std_print }
- }
def peek(inp):
if len(inp) == 0:
@@ -24,19 +15,17 @@ def evaluate(items, pop):
pop = nxt.value
return evaluate(items[1:], pop)
elif isinstance(nxt, NebSymbol):
- if not nxt.name in std:
+ if not nxt.name in STD:
raise Exception(f"no such symbol: '{nxt.name}'")
- this_func = std[nxt.name]
- return evaluate(items[1:], this_func["impl"])
+ this_func = STD[nxt.name]
+ return evaluate(items[1:], this_func[list(this_func.keys())[0]].impl) # TODO show all
elif isinstance(nxt, NebExpression):
- if not nxt.symbol.name in std:
+ if not nxt.symbol.name in STD:
raise Exception(f"no such symbol: {nxt.symbol.name}")
- this_func = std[nxt.symbol.name]
- #expected_sig = " ".join(x.type_.name for x in nxt.args)
- #if this_func["func"].in_sig() != expected_sig:
- if this_func["func"].in_sig() != nxt.maybe_sig():
- raise Exception(f"{nxt.symbol.name} expects '{this_func['func'].in_sig()}', got '{nxt.maybe_sig()}'")
- ret = this_func["impl"](*(nxt.args))
+ this_func = STD[nxt.symbol.name]
+ if nxt.maybe_sig() not in this_func:
+ raise Exception(f"'{nxt.symbol.name}' called with unknown signature: '{nxt.maybe_sig()}'")
+ ret = this_func[nxt.maybe_sig()].impl(*(nxt.args))
return evaluate(items[1:], ret)
else:
raise Exception("expected a literal or an expression")