From b395d5d1cd122bb07017f23110f76249398a61bb Mon Sep 17 00:00:00 2001 From: mryouse Date: Sat, 4 Jun 2022 02:05:32 +0000 Subject: add first-char, rest-char, slice --- interpreter.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'interpreter.py') diff --git a/interpreter.py b/interpreter.py index dbf8c82..04160cd 100644 --- a/interpreter.py +++ b/interpreter.py @@ -712,3 +712,38 @@ def interpretExists(symbol, args, env): return Literal(Path(file_or_dir.value).resolve().exists()) GLOBALS.register("exists?", Builtin(interpretExists, 1)) + +def interpretFirstChar(symbol, args, env): + ev = evaluate(args[0], env) + if not isinstance(ev, Literal): + raise Exception("'first-char' expects a string") + if len(ev.value) == 0: + raise Exception("string is empty") + return Literal(ev.value[0]) + +GLOBALS.register("first-char", Builtin(interpretFirstChar, 1)) + +def interpretRestChar(symbol, args, env): + ev = evaluate(args[0], env) + if not isinstance(ev, Literal): + raise Exception("'rest-char' expects a string") + return Literal(ev.value[1:]) + +GLOBALS.register("rest-char", Builtin(interpretRestChar, 1)) + +def interpretSlice(symbol, args, env): + lst = evaluate(args[0], env) + if not isinstance(lst, List): + raise Exception("'slice' expects a list as its first argument") + idx = evaluate(args[1], env) + if not isinstance(idx, Literal): + raise Exception("'slice' expects an integer as its second argument") + if len(args) == 2: + return List(lst.args[idx.value - 1:]) + length = evaluate(args[2], env) + if not isinstance(length, Literal): + raise Exception("'slice' expects an integer as its third argument") + diff = idx.value - 1 + length.value + return List(lst.args[idx.value - 1:diff]) + +GLOBALS.register("slice", Builtin(interpretSlice, 2, 3)) -- cgit v1.2.3