aboutsummaryrefslogtreecommitdiff
path: root/interpreter.py
diff options
context:
space:
mode:
authormryouse2022-05-25 01:07:00 +0000
committermryouse2022-05-25 01:07:00 +0000
commita42cd74b24cf671cdeaaa813f1dd5b2e44a7dfe6 (patch)
tree4021e653491779736a3b4e51fcdec96812c6a3da /interpreter.py
parentcda02b2b28acb543e244346ba938c6efa36b6e1a (diff)
implement shuf, list?, block, exit, unlink
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))
+