aboutsummaryrefslogtreecommitdiff
path: root/repl.d
diff options
context:
space:
mode:
Diffstat (limited to 'repl.d')
-rw-r--r--repl.d104
1 files changed, 104 insertions, 0 deletions
diff --git a/repl.d b/repl.d
new file mode 100644
index 0000000..9ea36d6
--- /dev/null
+++ b/repl.d
@@ -0,0 +1,104 @@
+import std.stdio;
+import std.string;
+import std.conv;
+import std.container : SList;
+import std.container : DList;
+import std.variant;
+
+alias Token = Algebraic!(int, string);
+
+auto dataStack = SList!int();
+
+bool defMode = false;
+string defModeWord = "";
+
+DList!Token[string] wordMap;
+
+void push(ref DList!Token stack, int value) {
+ stack.insertBack(Token(value));
+}
+
+void push(ref DList!Token stack, string word) {
+ stack.insertBack(Token(word));
+}
+
+void push(ref DList!Token[string] map, int value) {
+ map[defModeWord].push(value);
+}
+
+void push(ref DList!Token[string] map, string word) {
+ if ( defModeWord == "" ) {
+ defModeWord = word;
+ map[defModeWord] = DList!Token();
+ } else {
+ map[defModeWord].push(word);
+ }
+}
+
+void push(ref SList!int stack, int value) {
+ if ( defMode ) {
+ wordMap.push(value);
+ } else {
+ stack.insertFront(value);
+ }
+}
+
+void push(ref SList!int stack, string word) {
+ if ( defMode ) {
+ if ( word == ";" ) {
+ defMode = false;
+ defModeWord = "";
+ } else {
+ wordMap.push(word);
+ }
+ } else {
+ switch ( word ) {
+ case "ยง":
+ defMode = true;
+ defModeWord = "";
+ break;
+ case "+":
+ auto a = stack.pop();
+ auto b = stack.pop();
+
+ stack.push(a + b);
+ break;
+ case "*":
+ auto a = stack.pop();
+ auto b = stack.pop();
+
+ stack.push(a * b);
+ break;
+ case ".":
+ writeln(stack.front);
+ break;
+ default:
+ foreach ( token; wordMap[word] ) {
+ if ( token.type == typeid(int) ) {
+ stack.push(*token.peek!int);
+ } else {
+ stack.push(*token.peek!string);
+ }
+ }
+ }
+ }
+}
+
+int pop(ref SList!int stack) {
+ auto x = stack.front;
+ stack.removeFront;
+
+ return x;
+}
+
+void main() {
+ while ( !stdin.eof ) {
+ foreach ( word; stdin.readln.split ) {
+ if ( word.isNumeric ) {
+ dataStack.push(parse!int(word));
+ } else {
+ dataStack.push(word);
+ }
+ }
+ }
+}