diff options
| author | Julian Hurst <ark@mansus.space> | 2026-03-28 23:51:24 +0100 |
|---|---|---|
| committer | Julian Hurst <ark@mansus.space> | 2026-03-28 23:51:24 +0100 |
| commit | 678a38d41ba21c260ee74e1dbc516c6f5fe7222d (patch) | |
| tree | edf934167440c2a3938f9773133e42696dde42a2 /internal | |
| parent | 85ae695db10555d4890556c2abac6c18eb4c2182 (diff) | |
| download | rabbitscript-678a38d41ba21c260ee74e1dbc516c6f5fe7222d.tar.gz | |
Add string interpolation
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/interpreter/interpreter.ha | 36 |
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) = { |
