diff options
| -rw-r--r-- | interpreter.py | 61 | 
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)) | 
