diff options
| author | mryouse | 2022-07-20 17:04:30 +0000 |
|---|---|---|
| committer | mryouse | 2022-07-20 17:04:30 +0000 |
| commit | 454a7bbc16f1967d3e7e41089618f63a533cc2eb (patch) | |
| tree | 388e2e493a63d3dfb8b1abb262c65b809d7c95c9 /neb | |
| parent | 0e3581b64d787dc3960f8acb2d6678340895661a (diff) | |
WIP implement multifunc for functools
Diffstat (limited to 'neb')
| -rw-r--r-- | neb/std/functools.py | 30 |
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) |
