diff options
| author | mryouse | 2022-05-25 01:07:00 +0000 |
|---|---|---|
| committer | mryouse | 2022-05-25 01:07:00 +0000 |
| commit | a42cd74b24cf671cdeaaa813f1dd5b2e44a7dfe6 (patch) | |
| tree | 4021e653491779736a3b4e51fcdec96812c6a3da /interpreter.py | |
| parent | cda02b2b28acb543e244346ba938c6efa36b6e1a (diff) | |
implement shuf, list?, block, exit, unlink
Diffstat (limited to 'interpreter.py')
| -rw-r--r-- | interpreter.py | 50 |
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)) + |
