diff options
Diffstat (limited to 'neb/__init__.py')
| -rw-r--r-- | neb/__init__.py | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/neb/__init__.py b/neb/__init__.py index b280914..6aeec88 100644 --- a/neb/__init__.py +++ b/neb/__init__.py @@ -11,7 +11,7 @@ def interpret(exprs, env, ns=None): return ret def evaluate(expr, env, ns=None): - if isinstance(expr, Literal) or isinstance(expr, Function) or isinstance(expr, TypeWrap) or isinstance(expr, List) or isinstance(expr, Handle): + if isinstance(expr, Literal) or isinstance(expr, Callable) or isinstance(expr, TypeWrap) or isinstance(expr, List) or isinstance(expr, Handle): return expr elif isinstance(expr, Symbol) or isinstance(expr, Type): if env.contains(expr.name): @@ -57,18 +57,6 @@ class Callable: out.append(string_args(self.args, self.many)) return " ".join(out).strip() + f") => {self.return_type}" - def precall(self, symbol, params, env, ns): - pass - - def call(self, expr, env): - pass - - -class Function(Callable): - - def __init__(self, name, params, body, args=None, many=None): - super().__init__(name, params, body, args, many) - def arity_check(self, symbol, params): min_arity = len([a for a in self.args if not a.optional]) max_arity = -1 if self.many is not None else len(self.args) @@ -83,6 +71,34 @@ class Function(Callable): raise InterpretPanic(symbol, f"expected [{fmt}] arguments, received {len(params)}") return True + def call(self, expr, env): + pass + +class Macro(Callable): + + def __init__(self, name, params, body, args=None, many=None): + super().__init__(name, params, body, args, many) + +class NebMacro(Callable): + + def __init__(self, name, callable_, args=None, many=None, return_type=None): + super().__init__(name, None, callable_, args, many) + if return_type is not None: + self.return_type = return_type + + def __str__(self): + return f"builtin function {self.name}" + + def call(self, expr, env, ns): + self.arity_check(expr.args[0], expr.args[1:]) + return self.body(expr.args[0], expr.args[1:], env, ns) + + +class Function(Callable): + + def __init__(self, name, params, body, args=None, many=None): + super().__init__(name, params, body, args, many) + def precall(self, symbol, params, env, ns): ret = [] |
