diff options
| author | mryouse | 2022-06-04 02:05:32 +0000 |
|---|---|---|
| committer | mryouse | 2022-06-04 02:05:32 +0000 |
| commit | b395d5d1cd122bb07017f23110f76249398a61bb (patch) | |
| tree | 1bfd23e47d9a11c55353444c4a7853eaa94a7a53 /interpreter.py | |
| parent | c1e97e348c5dbac6ddd085509582a01af2cb45bb (diff) | |
add first-char, rest-char, slice
Diffstat (limited to 'interpreter.py')
| -rw-r--r-- | interpreter.py | 35 |
1 files changed, 35 insertions, 0 deletions
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)) |
