From 61c15b3a09fee5561aa9f1ac4136526cb88a747f Mon Sep 17 00:00:00 2001 From: mryouse Date: Mon, 6 Jun 2022 00:44:59 +0000 Subject: implement clear, ascii-gray, input, append, remove, while --- interpreter.py | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) (limited to 'interpreter.py') diff --git a/interpreter.py b/interpreter.py index 60338f1..37682c4 100644 --- a/interpreter.py +++ b/interpreter.py @@ -750,3 +750,64 @@ def interpretSlice(symbol, args, env): return List(lst.args[idx.value - 1:diff]) GLOBALS.register("slice", Builtin(interpretSlice, 2, 3)) + +def interpretClear(symbol, args, env): + subprocess.run(["clear"]) + return List([]) + +GLOBALS.register("clear", Builtin(interpretClear, 0)) + +def interpretAsciiGray(symbol, args, env): + ev = evaluate(args[0], env) + if not isinstance(ev, String): + raise InterpretPanic(symbol, "expects a :string", ev) + return String(f"\033[90m{ev.value}\033[0m") + +GLOBALS.register("ascii-gray", Builtin(interpretAsciiGray, 1)) + +def interpretInput(symbol, args, env): + ev = evaluate(args[0], env) + if not isinstance(ev, String): + raise InterpretPanic(symbol, "expects a :string", ev) + ret = input(ev.value) + return String(ret) + +GLOBALS.register("input", Builtin(interpretInput, 1)) + +def interpretAppend(symbol, args, env): + lst = evaluate(args[0], env) + if not isinstance(lst, List): + raise InterpretPanic(symbol, "expects a :list as its first argument", lst) + val = evaluate(args[1], env) + items = lst.args[:] + return List(items + [val], True) + +GLOBALS.register("append", Builtin(interpretAppend, 2)) + +def interpretRemove(symbol, args, env): + lst = evaluate(args[0], env) + if not isinstance(lst, List): + raise InterpretPanic(symbol, "expects a :list as its first argument", lst) + key = evaluate(args[1], env) + out = [] + for arg in lst.args: + if arg.args[0].value != key.value: + out.append(arg) + return List(out, True) + +GLOBALS.register("remove", Builtin(interpretRemove, 2)) + +def interpretWhile(symbol, args, env): + cond = args[0] + ret = List([]) + while True: + ev = evaluate(cond, env) + if not isinstance(ev, Bool): + raise InterpretPanic(symbol, "expects a :bool condition", ev) + if not ev.value: + break + for arg in args[1:]: + ret = evaluate(arg, env) + return ret + +GLOBALS.register("while", Builtin(interpretWhile)) -- cgit v1.2.3