From 3e70f2ce47ee954640df9ee3b432964c1111b5ed Mon Sep 17 00:00:00 2001 From: mryouse Date: Tue, 10 May 2022 02:46:42 +0000 Subject: refactor: std to own file, implement 'exit', multiple sigs --- runner.py | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) (limited to 'runner.py') 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") -- cgit v1.2.3