From 678a38d41ba21c260ee74e1dbc516c6f5fe7222d Mon Sep 17 00:00:00 2001 From: Julian Hurst Date: Sat, 28 Mar 2026 23:51:24 +0100 Subject: Add string interpolation --- internal/interpreter/interpreter.ha | 36 +++++++++++++++++++++++++++++++++--- 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) = { diff --git a/test.ra b/test.ra index de49f3d..01eaee0 100644 --- a/test.ra +++ b/test.ra @@ -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") -- cgit v1.2.3