diff options
| author | mryouse | 2022-06-15 21:44:12 +0000 |
|---|---|---|
| committer | mryouse | 2022-06-15 21:44:12 +0000 |
| commit | 718d37d4e689680b8a2be6ca79f3fc6555bbef7c (patch) | |
| tree | 38dae6f437439690b2f0d14b757fc1358c0e6f32 | |
| parent | 7b2b473976e06369310c910dc69a14450923a4d2 (diff) | |
implement filter, same limitations as 'map'
| -rw-r--r-- | interpreter.py | 19 |
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)])) |
