diff options
| author | Julian Hurst <ark@mansus.space> | 2026-03-28 19:17:16 +0100 |
|---|---|---|
| committer | Julian Hurst <ark@mansus.space> | 2026-03-28 19:17:16 +0100 |
| commit | 474c14c92de165516f4302685e3fa8acc3a64f45 (patch) | |
| tree | 6c1315dd6ea19c35f8a15f4ac6179e286e57bce7 /internal/interpreter/interpreter.ha | |
| parent | 4f7aa6ba55ace8e81dde90183ed2e17d05bce8e5 (diff) | |
| download | rabbitscript-474c14c92de165516f4302685e3fa8acc3a64f45.tar.gz | |
Add finvoke parsing and interpreting
Diffstat (limited to 'internal/interpreter/interpreter.ha')
| -rw-r--r-- | internal/interpreter/interpreter.ha | 32 |
1 files changed, 31 insertions, 1 deletions
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; |
