From 389b8e77f90f3b9586f38366aef9a7c955c4c4c3 Mon Sep 17 00:00:00 2001 From: mryouse Date: Tue, 24 May 2022 03:38:51 +0000 Subject: implement glob, shell, empty --- interpreter.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'interpreter.py') diff --git a/interpreter.py b/interpreter.py index 2721a63..778c48e 100644 --- a/interpreter.py +++ b/interpreter.py @@ -1,5 +1,8 @@ from structs import Literal, Symbol, List from pathlib import Path +from glob import glob +import subprocess +import shlex class Function: @@ -545,3 +548,33 @@ def interpretApply(symbol, args, env): return evaluate(new_lst, env) GLOBALS.register("apply", Builtin(interpretApply, 2)) + +def interpretGlob(symbol, args, env): + ev = evaluate(args[0], env) + if not isinstance(ev, Literal): + raise Exception("'glob' expects a string") + items = glob(ev.value) + out = [] + for item in items: + out.append(Literal(item)) + return List(out, True) + +GLOBALS.register("glob", Builtin(interpretGlob, 1)) + +def interpretShell(symbol, args, env): + ev = evaluate(args[0], env) + if not isinstance(ev, Literal): + raise Exception("'$' expects a string") + # TODO either fail or throw exception (?) on error + ret = subprocess.run(shlex.split(ev.value), capture_output=True) + return List([Literal(r) for r in ret.stdout.decode("utf-8").split("\n")], True) + +GLOBALS.register("$", Builtin(interpretShell, 1)) + +def interpretEmpty(symbol, args, env): + ev = evaluate(args[0], env) + if not isinstance(ev, List): + raise Exception("'empty?' expects a List") + return Literal(len(ev.args) == 0) + +GLOBALS.register("empty?", Builtin(interpretEmpty, 1)) -- cgit v1.2.3