From 384553ba9ddece11038eb2b4ecbd04d947c23300 Mon Sep 17 00:00:00 2001 From: mryouse Date: Wed, 15 Jun 2022 21:45:02 +0000 Subject: filter supports lambdas --- interpreter.py | 9 +++++---- 1 file 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)])) -- cgit v1.2.3