diff options
Diffstat (limited to 'interpreter.py')
| -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)])) |
