summaryrefslogtreecommitdiff
path: root/internal/interpreter
diff options
context:
space:
mode:
Diffstat (limited to 'internal/interpreter')
-rw-r--r--internal/interpreter/interpreter.ha16
1 files changed, 12 insertions, 4 deletions
diff --git a/internal/interpreter/interpreter.ha b/internal/interpreter/interpreter.ha
index 947dc8f..24f6f01 100644
--- a/internal/interpreter/interpreter.ha
+++ b/internal/interpreter/interpreter.ha
@@ -77,10 +77,7 @@ fn replacevars(it: *interpreter, s: str) str = {
return sa;
};
-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;
-
+fn assignop(it: *interpreter, nodes: []parser::ast, varname: parser::varname, operation: parser::operation) (void | error) = {
let value = 0;
let stack: []int = [];
@@ -114,3 +111,14 @@ fn assign(it: *interpreter, nodes: []parser::ast) (void | error) = {
let last = len(stack) - 1;
append(it.vars, (varname, strings::dup(strconv::itos(stack[last]))?))?;
};
+
+fn assign(it: *interpreter, nodes: []parser::ast) (void | error) = {
+ const varname = nodes[0].value as parser::varname;
+ const operation = match (nodes[1].value) {
+ case let op: parser::operation =>
+ return assignop(it, nodes, varname, op);
+ case let s: parser::strlit =>
+ let sa = replacevars(it, s);
+ append(it.vars, (varname, sa))?;
+ };
+};