aboutsummaryrefslogtreecommitdiff
path: root/interpreter.py
diff options
context:
space:
mode:
authormryouse2022-06-15 21:44:12 +0000
committermryouse2022-06-15 21:44:12 +0000
commit718d37d4e689680b8a2be6ca79f3fc6555bbef7c (patch)
tree38dae6f437439690b2f0d14b757fc1358c0e6f32 /interpreter.py
parent7b2b473976e06369310c910dc69a14450923a4d2 (diff)
implement filter, same limitations as 'map'
Diffstat (limited to 'interpreter.py')
-rw-r--r--interpreter.py19
1 files changed, 19 insertions, 0 deletions
diff --git a/interpreter.py b/interpreter.py
index 63b9187..000b3c2 100644
--- a/interpreter.py
+++ b/interpreter.py
@@ -855,3 +855,22 @@ def interpretFloor(symbol, args, env, ns):
return Int(math.floor(args[0].value))
GLOBALS.register("floor", Builtin(interpretFloor, [Arg("floor", TypeEnum.NUMBER, False, False)]))
+
+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)
+ 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)
+ 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)]))