summaryrefslogtreecommitdiff
path: root/internal/interpreter
diff options
context:
space:
mode:
Diffstat (limited to 'internal/interpreter')
-rw-r--r--internal/interpreter/.interpreter.ha.swpbin12288 -> 0 bytes
-rw-r--r--internal/interpreter/interpreter.ha32
2 files changed, 31 insertions, 1 deletions
diff --git a/internal/interpreter/.interpreter.ha.swp b/internal/interpreter/.interpreter.ha.swp
deleted file mode 100644
index 76a76c9..0000000
--- a/internal/interpreter/.interpreter.ha.swp
+++ /dev/null
Binary files differ
diff --git a/internal/interpreter/interpreter.ha b/internal/interpreter/interpreter.ha
index 5e92461..f4ff180 100644
--- a/internal/interpreter/interpreter.ha
+++ b/internal/interpreter/interpreter.ha
@@ -1,22 +1,52 @@
+use fmt;
use internal::parser;
use strconv;
use strings;
+use os::exec;
export type variable = (str, str);
export type interpreter = struct {
vars: []variable,
};
-export type error = !(interperror | nomem);
+export type error = !(interperror | exec::error | nomem);
export type interperror = !str;
export fn interpret(it: *interpreter, tree: parser::ast) void = {
match (tree.value) {
case parser::assign =>
assign(it, tree.children)!;
+ case parser::finvoke =>
+ match (invoke(it, tree.children)) {
+ case let e: exec::error =>
+ fmt::errorln(exec::strerror(e))!;
+ case void => void;
+ case let e: interperror =>
+ fmt::fatal(e);
+ case nomem =>
+ fmt::fatal("No memory left");
+ };
};
};
+fn printinvoke(it: *interpreter, nodes: []parser::ast) (void | error) = {
+ const fname = nodes[0].value as parser::varname;
+ const arglist = nodes[1].value as parser::arglist;
+
+ let args = strings::join(", ", arglist...)!;
+ defer free(args);
+ fmt::errorfln("{}: {}", fname, args)!;
+};
+
+fn invoke(it: *interpreter, nodes: []parser::ast) (void | error) = {
+ const fname = nodes[0].value as parser::varname;
+ const arglist = nodes[1].value as parser::arglist;
+
+ let cmd = exec::cmd(fname, arglist...)?;
+ let proc = exec::start(&cmd)?;
+ let status = exec::wait(&proc)?;
+};
+
fn assign(it: *interpreter, nodes: []parser::ast) (void | error) = {
const varname = nodes[0].value as parser::varname;
const operation = nodes[1].value as parser::operation;