diff options
| -rw-r--r-- | internal/interpreter/interpreter.ha | 36 | ||||
| -rw-r--r-- | test.ra | 5 |
2 files changed, 38 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) = { @@ -1,3 +1,8 @@ a=2 1 + 6 * b=3 5 * + ls() +print("hello world!") +print("(2 + 1) * 6 = ${a}") +print("3 * 5 = ${b}") +mpv("--shuffle", "/home/juju/vids/Simpsons") |
