from tokens import * from std import STD def peek(inp): if len(inp) == 0: return None return inp[0] def evaluate(items, pop): nxt = peek(items) if nxt is None: return pop elif isinstance(nxt, NebLiteral): pop = nxt.value return evaluate(items[1:], pop) elif isinstance(nxt, NebSymbol): 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[list(this_func.keys())[0]].impl) # TODO show all elif isinstance(nxt, NebExpression): if not nxt.symbol.name in STD: raise Exception(f"no such symbol: {nxt.symbol.name}") 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")