diff options
Diffstat (limited to 'internal/interpreter')
| -rw-r--r-- | internal/interpreter/.interpreter.ha.swp | bin | 12288 -> 0 bytes | |||
| -rw-r--r-- | internal/interpreter/interpreter.ha | 32 |
2 files changed, 31 insertions, 1 deletions
diff --git a/internal/interpreter/.interpreter.ha.swp b/internal/interpreter/.interpreter.ha.swp Binary files differdeleted file mode 100644 index 76a76c9..0000000 --- a/internal/interpreter/.interpreter.ha.swp +++ /dev/null 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; |
