aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--interpreter.py61
1 files changed, 61 insertions, 0 deletions
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))