diff options
| author | mryouse | 2022-06-21 01:49:29 +0000 |
|---|---|---|
| committer | mryouse | 2022-06-21 01:49:29 +0000 |
| commit | 776fe3193b515c028b5ac69326baed51d760d32f (patch) | |
| tree | db111c3fe7a20143b2f058259f86dbbecae4cbd6 /neb/std/strings.py | |
| parent | b1550660adaca68bb38541aed371e36b7000e124 (diff) | |
refactor: break stdlib into several files
Diffstat (limited to 'neb/std/strings.py')
| -rw-r--r-- | neb/std/strings.py | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/neb/std/strings.py b/neb/std/strings.py new file mode 100644 index 0000000..0d5ebdb --- /dev/null +++ b/neb/std/strings.py @@ -0,0 +1,53 @@ +from .. import TypeEnum, Environment, Arg, Builtin, evaluate +from ..structs import * + +STRINGS = Environment() + +def interpretConcat(symbol, args, env, ns): + out = "" + for arg in args: + out += arg.value + return String(out) + +string_arg = Arg("arg", TypeEnum.STRING) +STRINGS.register("concat", Builtin(interpretConcat, [string_arg, string_arg], string_arg)) + +def interpretStrip(symbol, args, env, ns): + return String(args[0].value.strip()) + +STRINGS.register("strip", Builtin(interpretStrip, [Arg("filename", TypeEnum.STRING)])) +def interpretStrip(symbol, args, env, ns): + return String(args[0].value.strip()) + +STRINGS.register("strip", Builtin(interpretStrip, [Arg("filename", TypeEnum.STRING)])) + +def interpretSplit(symbol, args, env, ns): + target = args[0] + if len(args) == 1: + return List([String(char) for char in target.value]) + splitter = args[1] + ret = target.value.split(splitter.value) + return List([String(r) for r in ret]) + +STRINGS.register("split", Builtin(interpretSplit, [Arg("target", TypeEnum.STRING)], Arg("splitter", TypeEnum.STRING, optional=True))) + +def interpretJoin(symbol, args, env, ns): + lst = args[0] + target = args[1] + return String(target.value.join([a.value for a in lst.args])) + +join_list_arg = Arg("list", TypeEnum.LIST) +join_string_arg = Arg("joiner", TypeEnum.STRING) +STRINGS.register("join", Builtin(interpretJoin, [join_list_arg, join_string_arg])) + +def interpretFirstChar(symbol, args, env, ns): + if len(args[0].value) == 0: + raise InterpretPanic(symbol, ":string is empty", ev) + return String(args[0].value[0]) + +STRINGS.register("first-char", Builtin(interpretFirstChar, [Arg("string", TypeEnum.STRING)])) + +def interpretRestChar(symbol, args, env, ns): + return String(args[0].value[1:]) + +STRINGS.register("rest-char", Builtin(interpretRestChar, [Arg("string", TypeEnum.STRING)])) |
