diff options
author | Adrian Kummerlaender | 2017-04-15 14:02:50 +0200 |
---|---|---|
committer | Adrian Kummerlaender | 2017-04-15 14:02:50 +0200 |
commit | 47611c4938363346be414b1cf00a63b438e043c4 (patch) | |
tree | a08a727821c074d513a95e192ad3b43fcdfa4405 | |
parent | 5ca4d7acb5545050a731b0adc2e39b3ed65b7fc9 (diff) | |
download | slang-47611c4938363346be414b1cf00a63b438e043c4.tar slang-47611c4938363346be414b1cf00a63b438e043c4.tar.gz slang-47611c4938363346be414b1cf00a63b438e043c4.tar.bz2 slang-47611c4938363346be414b1cf00a63b438e043c4.tar.lz slang-47611c4938363346be414b1cf00a63b438e043c4.tar.xz slang-47611c4938363346be414b1cf00a63b438e043c4.tar.zst slang-47611c4938363346be414b1cf00a63b438e043c4.zip |
Perform custom word definition at the same level as conditional primitives
-rw-r--r-- | source/app.d | 21 | ||||
-rw-r--r-- | source/base/stack.d | 6 | ||||
-rw-r--r-- | source/primitives/conditional.d | 2 | ||||
-rw-r--r-- | source/primitives/eval.d | 20 |
4 files changed, 24 insertions, 25 deletions
diff --git a/source/app.d b/source/app.d index 7d25f7f..0f17afc 100644 --- a/source/app.d +++ b/source/app.d @@ -9,7 +9,7 @@ import base.stack; import definition = base.definition; import primitives = primitives.eval; -Stack!Token resolve(Token token) { +Stack!Token evaluate(Token token) { try { if ( primitives.evaluate(token) ) { return primitives.result; @@ -31,17 +31,14 @@ void process(string value) { auto buffer = make!(Stack!Token)(toToken(value)); do { - 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[]); - } + Token current = buffer.pop; + Stack!Token result = evaluate(current); + + if ( !result.empty ) { + if ( result.front == current ) { + stack.push(current); + } else { + buffer.insertFront(result[]); } } } diff --git a/source/base/stack.d b/source/base/stack.d index 253bac0..e42ff12 100644 --- a/source/base/stack.d +++ b/source/base/stack.d @@ -5,8 +5,6 @@ import std.string; import std.variant; import std.container : SList; -import definition = base.definition; - alias Token = Algebraic!(int, bool, string); alias Stack = SList; @@ -35,9 +33,7 @@ Token pop(ref Stack!Token stack) { } void push(ref Stack!Token stack, Token token) { - if ( !definition.handle(token) ) { - stack.insertFront(token); - } + stack.insertFront(token); } template push(T) diff --git a/source/primitives/conditional.d b/source/primitives/conditional.d index 08c0f52..e5ba591 100644 --- a/source/primitives/conditional.d +++ b/source/primitives/conditional.d @@ -16,7 +16,7 @@ void capture(Token token) { } } -bool drop(Token token) { +bool handle(Token token) { if ( concluded && buffer.isNull ) { return false; } diff --git a/source/primitives/eval.d b/source/primitives/eval.d index 0ddd65a..0cb45b7 100644 --- a/source/primitives/eval.d +++ b/source/primitives/eval.d @@ -4,6 +4,8 @@ import std.variant; import base.stack; import primitives.core; + +import definition = base.definition; import conditional = primitives.conditional; bool evaluate_primitive(string word) { @@ -33,15 +35,19 @@ bool evaluate_primitive(string word) { } bool evaluate(Token token) { - if ( conditional.drop(token) ) { + if ( definition.handle(token) ) { + return true; + } + + if ( conditional.handle(token) ) { return true; - } else { - return token.visit!( - (int value) => false, - (bool value) => false, - (string word ) => evaluate_primitive(word) - ); } + + return token.visit!( + (int value) => false, + (bool value) => false, + (string word ) => evaluate_primitive(word) + ); } Stack!Token result() { |