diff options
Diffstat (limited to 'neb/std/fs.py')
| -rw-r--r-- | neb/std/fs.py | 61 | 
1 files changed, 61 insertions, 0 deletions
| diff --git a/neb/std/fs.py b/neb/std/fs.py new file mode 100644 index 0000000..2265719 --- /dev/null +++ b/neb/std/fs.py @@ -0,0 +1,61 @@ +from .. import TypeEnum, Environment, Arg, Builtin, evaluate +from ..structs import * +from pathlib import Path +from glob import glob + +FS = Environment() + +def interpretExists(symbol, args, env, ns): +    return Bool(Path(args[0].value).resolve().exists()) + +FS.register("exists?", Builtin(interpretExists, [Arg("filename", TypeEnum.STRING)])) + +def interpretGlob(symbol, args, env, ns): +    items = glob(args[0].value) +    return List([String(item) for item in items]) + +FS.register("glob", Builtin(interpretGlob, [Arg("regex", TypeEnum.STRING)])) + +def interpretUnlink(symbol, args, env, ns): +    target_path = Path(args[0].value).resolve() +    if not target_path.exists(): +        raise InterpretPanic(symbol, "target file does not exist", target_path) +    target_path.unlink() +    return List([]) + +FS.register("unlink", Builtin(interpretUnlink, [Arg("filename", TypeEnum.STRING)])) + +def interpretWithWrite(symbol, args, env, ns): +    target_file = args[0] +    new_env = Environment(env) +    target_path = Path(target_file.value).resolve() +    ret = Literal([]) +    with open(str(target_path), "w") as fil: +        new_env.register("_file_", List([fil])) # TODO wrong! +        for arg in args[1:]: +            ret = evaluate(arg, new_env, ns) +    return ret + +FS.register("with-write", Builtin(interpretWithWrite, [Arg("filename", TypeEnum.STRING)], Arg("exprs", TypeEnum.ANY, lazy=True))) + +def interpretWrite(symbol, args, env, ns): +    # write :string :filehandle +    line = args[0] +    handle = args[1] +    handle.args[0].write(line.value)  # TODO wrong! how do we evaluate a handle? +    return Literal([]) + +FS.register("write", Builtin(interpretWrite, [Arg("string", TypeEnum.STRING), Arg("filename", TypeEnum.LIST)])) + +def interpretReadLines(symbol, args, env, ns): +    target_file_name = args[0].value +    target_file = Path(target_file_name).resolve() +    if not target_file.exists(): +        raise InterpretPanic(symbol, "no such file", target_file) +    with open(target_file, "r") as fil: +        data = fil.readlines() +    out = List([String(d) for d in data]) # all lines are strings +    return out + +FS.register("read-lines", Builtin(interpretReadLines, [Arg("filename", TypeEnum.STRING)])) + | 
