summaryrefslogtreecommitdiff
path: root/internal/interpreter/interpreter.ha
diff options
context:
space:
mode:
Diffstat (limited to 'internal/interpreter/interpreter.ha')
-rw-r--r--internal/interpreter/interpreter.ha36
1 files changed, 33 insertions, 3 deletions
diff --git a/internal/interpreter/interpreter.ha b/internal/interpreter/interpreter.ha
index f4ff180..947dc8f 100644
--- a/internal/interpreter/interpreter.ha
+++ b/internal/interpreter/interpreter.ha
@@ -38,13 +38,43 @@ fn printinvoke(it: *interpreter, nodes: []parser::ast) (void | error) = {
fmt::errorfln("{}: {}", fname, args)!;
};
+fn print(args: str...) void = {
+ for (let arg .. args) {
+ fmt::println(arg)!;
+ };
+};
+
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 sarglist: []str = [];
+ defer strings::freeall(sarglist);
+ for (let arg .. arglist) {
+ append(sarglist, replacevars(it, arg))!;
+ };
- let cmd = exec::cmd(fname, arglist...)?;
- let proc = exec::start(&cmd)?;
- let status = exec::wait(&proc)?;
+ switch (fname) {
+ case "print" =>
+ print(sarglist...);
+ case =>
+ let cmd = exec::cmd(fname, sarglist...)?;
+ let proc = exec::start(&cmd)?;
+ let status = exec::wait(&proc)?;
+ };
+};
+
+fn replacevars(it: *interpreter, s: str) str = {
+ let repls: [](str, str) = [];
+ defer for (let repl .. repls) {
+ free(repl.0);
+ };
+ for (let var .. it.vars) {
+ let v = fmt::asprintf("${{{}}}", var.0)!;
+ append(repls, (v, var.1))!;
+ };
+ let sa = strings::multireplace(s, repls...)!;
+ return sa;
};
fn assign(it: *interpreter, nodes: []parser::ast) (void | error) = {