aboutsummaryrefslogtreecommitdiff
path: root/neb/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'neb/__init__.py')
-rw-r--r--neb/__init__.py96
1 files changed, 1 insertions, 95 deletions
diff --git a/neb/__init__.py b/neb/__init__.py
index f1f75d3..bfbea19 100644
--- a/neb/__init__.py
+++ b/neb/__init__.py
@@ -90,16 +90,6 @@ def evaluate(expr, env, ns=None):
raise InterpretPanic(expr.args[0], "unable to evaluate")
-# THINGS
-# - functions/syntax can have multiple arity definitions
-# - functions can have multiple same-arity, different-type definitions
-
-# callable
-# - name
-# - implementations
-# - signature (arguments (name and type), return type)
-
-
class Signature:
def __init__(self, *args, many=None, return_type=None):
@@ -123,7 +113,6 @@ class Signature:
return out
def get_type_by_idx(self, idx):
- #print(f"getting type by idx: {idx}")
if idx < len(self.args):
return self.args[idx]
else:
@@ -138,16 +127,6 @@ class Signature:
return out
-
-
-
-
-
-
-
-
-
-
class Callable:
def __init__(self, name, params, body, args=None, many=None):
@@ -156,7 +135,6 @@ class Callable:
self.body = body
self.args = args
self.many = many
- #self.type_ = TypeEnum.ANY # TODO no it's not
self.type_ = Type(":any") # TODO no it's not
self.return_type = Type(":any")
@@ -285,33 +263,6 @@ class NebSyntax(Special):
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 = []
-
- for idx, param in enumerate(params):
- if idx < len(self.args):
- arg = self.args[idx]
- else:
- arg = self.many
- ev = evaluate(param, env, ns)
- expected_type = evaluate(arg.type_, env, ns)
- valid = expected_type.validate_type(ev, env, ns)
- if not valid.value:
- exp = f"{arg.type_}"
- rec = f"{ev.type_}"
- raise InterpretPanic(symbol, f"received {rec}, expected {exp}", ev)
- ret.append(ev)
- return ret
- """
-
-
-#class Builtin(Function):
class Builtin(Callable):
def __init__(self, name, callable_, args=None, many=None, return_type=None):
@@ -323,23 +274,12 @@ class Builtin(Callable):
return f"builtin function {self.name}"
def call(self, expr, env, ns):
- '''
- self.arity_check(expr.args[0], expr.args[1:])
- evaluated_args = self.precall(expr.args[0], expr.args[1:], env, ns)
- return self.body(expr.args[0], evaluated_args, env, ns)
- '''
- #print(type(expr.args[1]))
return self.body(expr.args[0], expr.args[1:], env, ns)
-#class UserFunction(Function):
class UserFunction(Callable):
def __init__(self, name, params, many, body):
- #newparams, args, many = self.process_params(name, params)
- #super().__init__(name, newparams, body, args, many)
- #for p in params:
- # print(p)
super().__init__(name, params, body, params, many)
def __str__(self):
@@ -352,41 +292,7 @@ class UserFunction(Callable):
out = out + f"{expr} "
return out.strip() + ")"
-
- '''
- def process_params(self, name, params):
- newparams = []
- args = []
- many = None
- prev_type = False
- first = True
- for param in params:
- if isinstance(param, Symbol):
- if many is not None:
- raise NebPanic("& must be last argument")
- if param.name == "&":
- many = Arg(param.name, TypeEnum.ANY)
- else:
- newparams.append(param)
- args.append(Arg(param.name, TypeEnum.ANY))
- prev_type = False
- elif isinstance(param, Type) and not prev_type and not first:
- if many is None:
- #args[-1].type_ = param.name
- args[-1].type_ = param
- else:
- #many.type_ = param.name
- many.type_ = param
- prev_type = True
- else:
- raise NebPanic("invalid :func signature", param)
- first = False
- return newparams, args, many
- '''
-
def call(self, expr, env, ns):
- #self.arity_check(expr.args[0], expr.args[1:])
- #evaluated_args = self.precall(expr.args[0], expr.args[1:], env, ns)
evaluated_args = expr.args[1:]
this_env = Environment(env)
for idx, param in enumerate(self.params):
@@ -410,7 +316,7 @@ class TypeWrap:
# if it's an any type, it's valid
if self.parent is None:
return Bool(True)
- if isinstance(self.is_func, Function) or isinstance(self.is_func, MultiFunction):
+ if isinstance(self.is_func, MultiFunction):
valid = self.is_func.call(Expr([self.name, target]), env, ns)
else:
valid = self.is_func(self.name, [target], env, ns)