aboutsummaryrefslogtreecommitdiff
path: root/repl.d
diff options
context:
space:
mode:
Diffstat (limited to 'repl.d')
-rw-r--r--repl.d77
1 files changed, 34 insertions, 43 deletions
diff --git a/repl.d b/repl.d
index b68b46a..df2905d 100644
--- a/repl.d
+++ b/repl.d
@@ -1,69 +1,60 @@
import std.stdio;
import std.string;
-import std.conv;
import std.variant;
import std.typecons;
-import std.container : SList;
-
import src.stack;
static import definition = src.definition;
static import primitives = src.primitives.eval;
-template process(T)
-if ( is(T == int) || is(T == bool) ) {
- void process(T value) {
- try {
- if ( !primitives.evaluate(value) ) {
- stack.push(value);
- }
- }
- catch (Exception ex) {
- writeln("Error: ", ex.msg);
- }
- }
-}
-
-void process(string word) {
+Stack!Token resolve(Token token) {
try {
- if ( !primitives.evaluate(word) ) {
- if ( word in definition.words ) {
- foreach ( token; definition.words[word] ) {
- process(token);
- }
- } else {
- stack.push(word);
- }
+ if ( primitives.evaluate(token) ) {
+ return primitives.result;
+ } else {
+ return token.visit!(
+ (int value) => Stack!Token(Token(value)),
+ (bool value) => Stack!Token(Token(value)),
+ (string word ) => definition.get(word)
+ );
}
}
catch (Exception ex) {
writeln("Error: ", ex.msg);
+ return Stack!Token();
}
}
-void process(Token token) {
- token.visit!(
- (int value) => process(value),
- (bool value) => process(value),
- (string word ) => process(word)
- );
+void process(string value) {
+ Stack!Token buffer;
+ Token token = toToken(value);
+
+ if ( !definition.handle(token) ) {
+ buffer = resolve(token);
+ }
+
+ while ( !buffer.empty ) {
+ Token current = buffer.pop;
+
+ if ( !definition.handle(current) ) {
+ Stack!Token resolved = resolve(current);
+
+ if ( !resolved.empty ) {
+ if ( resolved.front == current ) {
+ stack.push(current);
+ } else {
+ buffer.insertFront(resolved[]);
+ }
+ }
+ }
+ }
}
void main() {
while ( !stdin.eof ) {
foreach ( token; stdin.readln.split ) {
- if ( token.isNumeric ) {
- auto value = parse!int(token);
-
- if ( !definition.handle(value) ) {
- process(value);
- }
- } else {
- if ( !definition.handle(token) ) {
- process(token);
- }
- }
+ process(token);
}
}
}