diff options
| author | mryouse | 2022-06-15 21:45:02 +0000 |
|---|---|---|
| committer | mryouse | 2022-06-15 21:45:02 +0000 |
| commit | 384553ba9ddece11038eb2b4ecbd04d947c23300 (patch) | |
| tree | ac2383e301639970aae7f57cce5b1bdcf541cce7 /interpreter.py | |
| parent | 718d37d4e689680b8a2be6ca79f3fc6555bbef7c (diff) | |
filter supports lambdas
Diffstat (limited to 'interpreter.py')
| -rw-r--r-- | interpreter.py | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/interpreter.py b/interpreter.py index 000b3c2..da8cc96 100644 --- a/interpreter.py +++ b/interpreter.py @@ -34,6 +34,7 @@ class Function: self.body = body self.args = args self.many = many + self.type_ = TypeEnum.ANY # TODO no it's not def describe(self, name=None): if name is None: @@ -859,18 +860,18 @@ GLOBALS.register("floor", Builtin(interpretFloor, [Arg("floor", TypeEnum.NUMBER, def interpretFilter(symbol, args, env, ns): # TODO: to support lambdas, we can't assume the func is defined func = args[0] - if not isinstance(func, Symbol): - raise InterpretPanic(symbol, "requires a symbol as its first argument", func) + if not isinstance(func, Function): + raise InterpretPanic(symbol, "requires a :func as its first argument", func) lst = evaluate(args[1], env, ns) if not isinstance(lst, List): raise InterpretPanic(symbol, "requires a :list as its second argument", lst) out = [] for arg in lst.args: - ev = evaluate(List([func, arg]), env, ns) + ev = func.call(List([func, arg]), env, ns) if not isinstance(ev, Bool): raise InterpretPanic(symbol, "function must return :bool", ev) if ev.value: out.append(arg) return List(out, True) -GLOBALS.register("filter", Builtin(interpretFilter, [Arg("func", TypeEnum.ANY, False, True), Arg("list", TypeEnum.LIST, False, False)])) +GLOBALS.register("filter", Builtin(interpretFilter, [Arg("func", TypeEnum.ANY, False, False), Arg("list", TypeEnum.LIST, False, False)])) |
