aboutsummaryrefslogtreecommitdiff
path: root/source/state/variable.d
diff options
context:
space:
mode:
authorAdrian Kummerlaender2017-04-16 13:17:22 +0200
committerAdrian Kummerlaender2017-04-16 13:17:22 +0200
commit44f419264898f84fe5536f3ea159c18b381e6083 (patch)
tree5fc32c362f3cb854c114b7d75260de87f654efaa /source/state/variable.d
parentc06a6ade2d144cd8042392e597ead385756bcbc7 (diff)
downloadslang-44f419264898f84fe5536f3ea159c18b381e6083.tar
slang-44f419264898f84fe5536f3ea159c18b381e6083.tar.gz
slang-44f419264898f84fe5536f3ea159c18b381e6083.tar.bz2
slang-44f419264898f84fe5536f3ea159c18b381e6083.tar.lz
slang-44f419264898f84fe5536f3ea159c18b381e6083.tar.xz
slang-44f419264898f84fe5536f3ea159c18b381e6083.tar.zst
slang-44f419264898f84fe5536f3ea159c18b381e6083.zip
Extract variable management, move into `state` package
Diffstat (limited to 'source/state/variable.d')
-rw-r--r--source/state/variable.d41
1 files changed, 41 insertions, 0 deletions
diff --git a/source/state/variable.d b/source/state/variable.d
new file mode 100644
index 0000000..f77e207
--- /dev/null
+++ b/source/state/variable.d
@@ -0,0 +1,41 @@
+module state.variable;
+
+import std.variant;
+
+import state.stack;
+
+bool handle(string word) {
+ switch ( word ) {
+ case "$" : binary_op_variable_bind; return true;
+ case "@" : unary_op_variable_resolve; return true;
+ default : return false;
+ }
+}
+
+bool handle(Token token) {
+ return token.visit!(
+ (int ) => false,
+ (bool ) => false,
+ (string word) => handle(word)
+ );
+}
+
+private {
+
+Token[string] variables;
+
+void binary_op_variable_bind() {
+ string name = stack.pop.get!string;
+ Token value = stack.pop;
+ variables[name] = value;
+}
+
+void unary_op_variable_resolve() {
+ string name = stack.pop.get!string;
+
+ if ( name in variables ) {
+ stack.push(variables[name]);
+ }
+}
+
+}