diff options
Diffstat (limited to 'runner.py')
| -rw-r--r-- | runner.py | 29 | 
1 files changed, 9 insertions, 20 deletions
| @@ -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") | 
