aboutsummaryrefslogtreecommitdiff
path: root/neb/__init__.py
diff options
context:
space:
mode:
authormryouse2022-07-07 03:48:05 +0000
committermryouse2022-07-07 03:48:05 +0000
commit3412d4d0e35dfe1faac5254199aa34f0354e992b (patch)
treed8cb5b69a2cf110d65faa2d2ddf0b6486038015d /neb/__init__.py
parent46cefa721d145af17bee3696ef533d752989458c (diff)
refactor: add Macro structure under Callable, which is all core
Diffstat (limited to 'neb/__init__.py')
-rw-r--r--neb/__init__.py42
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 = []