aboutsummaryrefslogtreecommitdiff
path: root/neb
diff options
context:
space:
mode:
authormryouse2022-07-20 17:04:30 +0000
committermryouse2022-07-20 17:04:30 +0000
commit454a7bbc16f1967d3e7e41089618f63a533cc2eb (patch)
tree388e2e493a63d3dfb8b1abb262c65b809d7c95c9 /neb
parent0e3581b64d787dc3960f8acb2d6678340895661a (diff)
WIP implement multifunc for functools
Diffstat (limited to 'neb')
-rw-r--r--neb/std/functools.py30
1 files changed, 21 insertions, 9 deletions
diff --git a/neb/std/functools.py b/neb/std/functools.py
index 8ef5630..b0e4ad9 100644
--- a/neb/std/functools.py
+++ b/neb/std/functools.py
@@ -1,11 +1,11 @@
-from .. import TypeEnum, Environment, Arg, Builtin, Function, evaluate, InterpretPanic, NebSyntax
+from .. import TypeEnum, Environment, Arg, Builtin, Function, evaluate, InterpretPanic, NebSyntax, MultiFunction
from ..structs import *
FUNCTOOLS = Environment()
def interpretFilter(symbol, args, env, ns):
func = args[0]
- if not isinstance(func, Function):
+ if not isinstance(func, MultiFunction):
raise InterpretPanic(symbol, "requires a :func as its first argument", func)
lst = args[1]
out = []
@@ -17,11 +17,14 @@ def interpretFilter(symbol, args, env, ns):
out.append(arg)
return List(out)
-FUNCTOOLS.register("filter", Builtin("filter", interpretFilter, [Arg("func", TypeEnum.ANY), Arg("list", TypeEnum.LIST)], return_type=Type(":list")))
+filter_func = Builtin("filter", interpretFilter, [Arg("func", TypeEnum.ANY), Arg("list", TypeEnum.LIST)], return_type=Type(":list"))
+filter_multi = MultiFunction("filter")
+filter_multi.register(filter_func)
+FUNCTOOLS.register("filter", filter_multi)
def interpretMap(symbol, args, env, ns):
func = args[0]
- if not isinstance(func, Function):
+ if not (isinstance(func, MultiFunction) or isinstance(func, NebSyntax)):
raise InterpretPanic(symbol, "requires a :func as its first argument", func)
lst = args[1]
if not isinstance(lst, List):
@@ -32,20 +35,26 @@ def interpretMap(symbol, args, env, ns):
out.append(ev)
return List(out)
-FUNCTOOLS.register("map", Builtin("map", interpretMap, [Arg("func", TypeEnum.ANY), Arg("list", TypeEnum.LIST)], return_type=Type(":list")))
+map_func = Builtin("map", interpretMap, [Arg("func", TypeEnum.ANY), Arg("list", TypeEnum.LIST)], return_type=Type(":list"))
+map_multi = MultiFunction("map")
+map_multi.register(map_func)
+FUNCTOOLS.register("map", map_multi)
# TODO I think this is wrong
def interpretApply(symbol, args, env, ns):
func = args[0]
- if not isinstance(func, Function):
+ if not (isinstance(func, MultiFunction) or isinstance(func, NebSyntax)):
raise InterpretPanic(symbol, "requires a symbol as its first argument", func)
return func.call(Expr([func] + args[1].args), env, ns)
-FUNCTOOLS.register("apply", Builtin("apply", interpretApply, [Arg("func", TypeEnum.ANY), Arg("list", TypeEnum.LIST)]))
+apply_func = Builtin("apply", interpretApply, [Arg("func", TypeEnum.ANY), Arg("list", TypeEnum.LIST)])
+apply_multi = MultiFunction("apply")
+apply_multi.register(apply_func)
+FUNCTOOLS.register("apply", apply_multi)
def interpretReduce(symbol, args, env, ns):
func = args[0]
- if not (isinstance(func, Function) or isinstance(func, NebSyntax)):
+ if not (isinstance(func, MultiFunction) or isinstance(func, NebSyntax)):
raise InterpretPanic(symbol, "requires a symbol as its first argument", func)
ret = args[2] # this is the accumulator
@@ -53,4 +62,7 @@ def interpretReduce(symbol, args, env, ns):
ret = func.call(Expr([func, ret, arg]), env, ns)
return ret
-FUNCTOOLS.register("reduce", Builtin("reduce", interpretReduce, [Arg("func", TypeEnum.ANY), Arg("list", TypeEnum.LIST), Arg("accum", TypeEnum.ANY)], return_type=Type(":list")))
+reduce_func = Builtin("reduce", interpretReduce, [Arg("func", TypeEnum.ANY), Arg("list", TypeEnum.LIST), Arg("accum", TypeEnum.ANY)], return_type=Type(":list"))
+reduce_multi = MultiFunction("reduce")
+reduce_multi.register(reduce_func)
+FUNCTOOLS.register("reduce", reduce_multi)