aboutsummaryrefslogtreecommitdiff
path: root/interpreter.py
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter.py')
-rw-r--r--interpreter.py50
1 files changed, 50 insertions, 0 deletions
diff --git a/interpreter.py b/interpreter.py
index 778c48e..afdde60 100644
--- a/interpreter.py
+++ b/interpreter.py
@@ -3,6 +3,8 @@ from pathlib import Path
from glob import glob
import subprocess
import shlex
+import random
+import sys
class Function:
@@ -578,3 +580,51 @@ def interpretEmpty(symbol, args, env):
return Literal(len(ev.args) == 0)
GLOBALS.register("empty?", Builtin(interpretEmpty, 1))
+
+def interpretShuf(symbol, args, env):
+ ev = evaluate(args[0], env)
+ if not isinstance(ev, List):
+ raise Exception("'shuf' expects a List")
+ items = ev.args[:]
+ random.shuffle(items)
+ return List(items, True)
+
+GLOBALS.register("shuf", Builtin(interpretShuf, 1))
+
+def interpretIsList(symbol, args, env):
+ ev = evaluate(args[0], env)
+ return Literal(isinstance(ev, List))
+
+GLOBALS.register("list?", Builtin(interpretIsList, 1))
+
+def interpretBlock(symbol, args, env):
+ ret = List([])
+ for arg in args:
+ ret = evaluate(arg, env)
+ return ret
+
+GLOBALS.register("block", Builtin(interpretBlock))
+
+def interpretExit(symbol, args, env):
+ if len(args) > 1:
+ raise Exception("'exit' only takes one (optional) argument")
+ status = 0 if len(args) == 0 else args[0].value
+ if type(status) is not int:
+ raise Exception("'exit' requires an :int")
+ sys.exit(status)
+ return List([])
+
+GLOBALS.register("exit", Builtin(interpretExit, 0, 1))
+
+def interpretUnlink(symbol, args, env):
+ ev = evaluate(args[0], env)
+ if not isinstance(ev, Literal):
+ raise Exception("'unlink' expects a string")
+ target_path = Path(ev.value).resolve()
+ if not target_path.exists():
+ raise Exception("'unlink' expects the target file to exist")
+ target_path.unlink()
+ return List([])
+
+GLOBALS.register("unlink", Builtin(interpretUnlink, 1))
+