From 57ab42eabb5a9a7ddf7d6a416bf18eca63336a87 Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Mon, 10 Apr 2017 21:41:32 +0200 Subject: Rewrite in D, support for word definitions --- repl.d | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 repl.d (limited to 'repl.d') 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); + } + } + } +} -- cgit v1.2.3