From 52ab357fe1d74f4ce9b5e08c3849c038db268a5a Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Thu, 7 Sep 2017 12:53:12 -0700 Subject: [PATCH] Remove nullability from reduction. --- .../nwapw/abacus/function/DomainException.java | 2 +- .../abacus/function/EvaluationException.java | 2 +- .../number/ComputationInterruptedException.java | 2 +- .../org/nwapw/abacus/plugin/StandardPlugin.java | 7 ++----- .../org/nwapw/abacus/tree/EvaluationResult.kt | 2 +- .../kotlin/org/nwapw/abacus/tree/FunctionNode.kt | 4 ++-- .../org/nwapw/abacus/tree/NumberBinaryNode.kt | 6 +++--- .../kotlin/org/nwapw/abacus/tree/NumberNode.kt | 2 +- .../org/nwapw/abacus/tree/NumberReducer.kt | 16 +++++++++------- .../org/nwapw/abacus/tree/NumberUnaryNode.kt | 2 +- .../main/kotlin/org/nwapw/abacus/tree/Reducer.kt | 2 +- .../kotlin/org/nwapw/abacus/tree/TreeNode.kt | 2 +- .../org/nwapw/abacus/tree/TreeValueBinaryNode.kt | 2 +- .../nwapw/abacus/tree/TreeValueFunctionNode.kt | 2 +- .../org/nwapw/abacus/tree/TreeValueUnaryNode.kt | 4 ++-- .../kotlin/org/nwapw/abacus/tree/VariableNode.kt | 2 +- .../org/nwapw/abacus/fx/AbacusController.java | 8 ++------ 17 files changed, 31 insertions(+), 36 deletions(-) diff --git a/core/src/main/java/org/nwapw/abacus/function/DomainException.java b/core/src/main/java/org/nwapw/abacus/function/DomainException.java index a7a449c..2d09dc3 100644 --- a/core/src/main/java/org/nwapw/abacus/function/DomainException.java +++ b/core/src/main/java/org/nwapw/abacus/function/DomainException.java @@ -18,7 +18,7 @@ public class DomainException extends RuntimeException { * Creates a new DomainException with a default message. */ public DomainException(){ - this("Domain Error"); + this("Domain error."); } } diff --git a/core/src/main/java/org/nwapw/abacus/function/EvaluationException.java b/core/src/main/java/org/nwapw/abacus/function/EvaluationException.java index bad85b9..55db570 100644 --- a/core/src/main/java/org/nwapw/abacus/function/EvaluationException.java +++ b/core/src/main/java/org/nwapw/abacus/function/EvaluationException.java @@ -11,7 +11,7 @@ public class EvaluationException extends RuntimeException { * Creates a new EvaluationException with the default string. */ public EvaluationException() { - super("Error evaluating expression."); + super("Evaluation error."); } /** diff --git a/core/src/main/java/org/nwapw/abacus/number/ComputationInterruptedException.java b/core/src/main/java/org/nwapw/abacus/number/ComputationInterruptedException.java index 2f7b3fd..e055508 100644 --- a/core/src/main/java/org/nwapw/abacus/number/ComputationInterruptedException.java +++ b/core/src/main/java/org/nwapw/abacus/number/ComputationInterruptedException.java @@ -10,7 +10,7 @@ public class ComputationInterruptedException extends RuntimeException { * Creates a new exception of this type. */ public ComputationInterruptedException() { - super("Computation interrupted by user."); + super("Computation interrupted."); } } diff --git a/core/src/main/java/org/nwapw/abacus/plugin/StandardPlugin.java b/core/src/main/java/org/nwapw/abacus/plugin/StandardPlugin.java index e144bbc..edaa3a5 100755 --- a/core/src/main/java/org/nwapw/abacus/plugin/StandardPlugin.java +++ b/core/src/main/java/org/nwapw/abacus/plugin/StandardPlugin.java @@ -29,8 +29,7 @@ public class StandardPlugin extends Plugin { @Override public NumberInterface applyInternal(MutableEvaluationContext context, TreeNode[] params) { String assignTo = ((VariableNode) params[0]).getVariable(); - NumberInterface value = params[1].reduce(context.getReducer()); - if(value == null) throw new EvaluationException(); + NumberInterface value = params[1].reduce(context.getInheritedReducer()); context.setVariable(assignTo, value); return value; } @@ -48,9 +47,7 @@ public class StandardPlugin extends Plugin { public NumberInterface applyInternal(MutableEvaluationContext context, TreeNode[] params) { String assignTo = ((VariableNode) params[0]).getVariable(); context.setDefinition(assignTo, params[1]); - NumberInterface value = params[1].reduce(context.getReducer()); - if(value == null) throw new EvaluationException(); - return value; + return params[1].reduce(context.getInheritedReducer()); } }; /** diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/EvaluationResult.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/EvaluationResult.kt index e94c9d6..a499877 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/EvaluationResult.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/EvaluationResult.kt @@ -3,4 +3,4 @@ package org.nwapw.abacus.tree import org.nwapw.abacus.context.MutableEvaluationContext import org.nwapw.abacus.number.NumberInterface -data class EvaluationResult(val value: NumberInterface?, val resultingContext: MutableEvaluationContext) \ No newline at end of file +data class EvaluationResult(val value: NumberInterface, val resultingContext: MutableEvaluationContext) \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/FunctionNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/FunctionNode.kt index d6a7696..e4d2acb 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/FunctionNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/FunctionNode.kt @@ -10,8 +10,8 @@ package org.nwapw.abacus.tree */ class FunctionNode(function: String, children: List) : CallNode(function, children) { - override fun reduce(reducer: Reducer): T? { - val children = Array(children.size, { children[it].reduce(reducer) ?: return null; }) + override fun reduce(reducer: Reducer): T { + val children = Array(children.size, { children[it].reduce(reducer) }) return reducer.reduceNode(this, *children) } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberBinaryNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberBinaryNode.kt index 36f585f..3742477 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberBinaryNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberBinaryNode.kt @@ -13,9 +13,9 @@ package org.nwapw.abacus.tree class NumberBinaryNode(operation: String, left: TreeNode, right: TreeNode) : BinaryNode(operation, left, right) { - override fun reduce(reducer: Reducer): T? { - val left = left.reduce(reducer) ?: return null - val right = right.reduce(reducer) ?: return null + override fun reduce(reducer: Reducer): T { + val left = left.reduce(reducer) + val right = right.reduce(reducer) return reducer.reduceNode(this, left, right) } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberNode.kt index 3507568..9278301 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberNode.kt @@ -10,7 +10,7 @@ package org.nwapw.abacus.tree */ class NumberNode(val number: String) : TreeNode() { - override fun reduce(reducer: Reducer): T? { + override fun reduce(reducer: Reducer): T { return reducer.reduceNode(this) } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberReducer.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberReducer.kt index c1a1da8..8f61923 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberReducer.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberReducer.kt @@ -2,6 +2,7 @@ package org.nwapw.abacus.tree import org.nwapw.abacus.Abacus import org.nwapw.abacus.context.EvaluationContext +import org.nwapw.abacus.function.EvaluationException import org.nwapw.abacus.number.NumberInterface class NumberReducer(val abacus: Abacus, context: EvaluationContext) : Reducer { @@ -12,18 +13,19 @@ class NumberReducer(val abacus: Abacus, context: EvaluationContext) : Reducer { context.inheritedNumberImplementation?.instanceForString(treeNode.number) + ?: throw EvaluationException() } is VariableNode -> { val variable = context.getVariable(treeNode.variable) if(variable != null) return variable val definition = context.getDefinition(treeNode.variable) if(definition != null) return definition.reduce(this) - null + throw EvaluationException() } is NumberUnaryNode -> { val child = children[0] as NumberInterface @@ -34,29 +36,29 @@ class NumberReducer(val abacus: Abacus, context: EvaluationContext) : Reducer { val left = children[0] as NumberInterface val right = children[1] as NumberInterface - val promotionResult = promotionManager.promote(left, right) ?: return null + val promotionResult = promotionManager.promote(left, right) ?: throw EvaluationException() context.numberImplementation = promotionResult.promotedTo abacus.pluginManager.operatorFor(treeNode.operation).apply(context, *promotionResult.items) } is FunctionNode -> { val promotionResult = promotionManager - .promote(*children.map { it as NumberInterface }.toTypedArray()) ?: return null + .promote(*children.map { it as NumberInterface }.toTypedArray()) ?: throw EvaluationException() context.numberImplementation = promotionResult.promotedTo abacus.pluginManager.functionFor(treeNode.callTo).apply(context, *promotionResult.items) } is TreeValueUnaryNode -> { abacus.pluginManager.treeValueOperatorFor(treeNode.operation) - .apply(context, treeNode.applyTo ?: return null) + .apply(context, treeNode.applyTo) } is TreeValueBinaryNode -> { abacus.pluginManager.treeValueOperatorFor(treeNode.operation) - .apply(context, treeNode.left ?: return null, treeNode.right ?: return null) + .apply(context, treeNode.left, treeNode.right) } is TreeValueFunctionNode -> { abacus.pluginManager.treeValueFunctionFor(treeNode.callTo) .apply(context, *treeNode.children.toTypedArray()) } - else -> null + else -> throw EvaluationException() } } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberUnaryNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberUnaryNode.kt index 1dff327..01a494f 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/NumberUnaryNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/NumberUnaryNode.kt @@ -11,7 +11,7 @@ package org.nwapw.abacus.tree class NumberUnaryNode(operation: String, child: TreeNode) : UnaryNode(operation, child) { - override fun reduce(reducer: Reducer): T? { + override fun reduce(reducer: Reducer): T { val child = applyTo.reduce(reducer) return reducer.reduceNode(this, child) } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/Reducer.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/Reducer.kt index 412af29..45cb4dc 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/Reducer.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/Reducer.kt @@ -14,6 +14,6 @@ interface Reducer { * @param treeNode the tree node to reduce. * @param children the list of children, of type T. */ - fun reduceNode(treeNode: TreeNode, vararg children: Any): T? + fun reduceNode(treeNode: TreeNode, vararg children: Any): T } \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeNode.kt index 2017739..a17b191 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeNode.kt @@ -5,6 +5,6 @@ package org.nwapw.abacus.tree */ abstract class TreeNode { - abstract fun reduce(reducer: Reducer): T? + abstract fun reduce(reducer: Reducer): T } \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueBinaryNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueBinaryNode.kt index e29319b..97cd0cf 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueBinaryNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueBinaryNode.kt @@ -14,7 +14,7 @@ package org.nwapw.abacus.tree class TreeValueBinaryNode(operation: String, left: TreeNode, right: TreeNode) : BinaryNode(operation, left, right) { - override fun reduce(reducer: Reducer): T? { + override fun reduce(reducer: Reducer): T { return reducer.reduceNode(this) } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueFunctionNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueFunctionNode.kt index ca24d9d..18301d8 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueFunctionNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueFunctionNode.kt @@ -9,7 +9,7 @@ package org.nwapw.abacus.tree */ class TreeValueFunctionNode(name: String, children: List) : CallNode(name, children) { - override fun reduce(reducer: Reducer): T? { + override fun reduce(reducer: Reducer): T { return reducer.reduceNode(this) } diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueUnaryNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueUnaryNode.kt index 7c3d836..dab3f52 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueUnaryNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/TreeValueUnaryNode.kt @@ -12,8 +12,8 @@ package org.nwapw.abacus.tree class TreeValueUnaryNode(operation: String, child: TreeNode) : UnaryNode(operation, child) { - override fun reduce(reducer: Reducer): T? { - return reducer.reduceNode(this); + override fun reduce(reducer: Reducer): T { + return reducer.reduceNode(this) } } \ No newline at end of file diff --git a/core/src/main/kotlin/org/nwapw/abacus/tree/VariableNode.kt b/core/src/main/kotlin/org/nwapw/abacus/tree/VariableNode.kt index 93d91dc..0fdf887 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/tree/VariableNode.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/tree/VariableNode.kt @@ -10,7 +10,7 @@ package org.nwapw.abacus.tree */ class VariableNode(val variable: String) : TreeNode() { - override fun reduce(reducer: Reducer): T? { + override fun reduce(reducer: Reducer): T { return reducer.reduceNode(this) } diff --git a/fx/src/main/java/org/nwapw/abacus/fx/AbacusController.java b/fx/src/main/java/org/nwapw/abacus/fx/AbacusController.java index 5f23a9a..f7fb44d 100644 --- a/fx/src/main/java/org/nwapw/abacus/fx/AbacusController.java +++ b/fx/src/main/java/org/nwapw/abacus/fx/AbacusController.java @@ -15,6 +15,7 @@ import org.nwapw.abacus.config.Configuration; import org.nwapw.abacus.function.Documentation; import org.nwapw.abacus.function.DocumentationType; import org.nwapw.abacus.function.DomainException; +import org.nwapw.abacus.function.EvaluationException; import org.nwapw.abacus.number.*; import org.nwapw.abacus.plugin.ClassFinder; import org.nwapw.abacus.plugin.PluginListener; @@ -147,16 +148,11 @@ public class AbacusController implements PluginListener { } EvaluationResult result = abacus.evaluateTree(constructedTree); NumberInterface evaluatedNumber = result.getValue(); - if (evaluatedNumber == null) { - return ERR_EVAL; - } String resultingString = evaluatedNumber.toString(); historyData.add(new HistoryModel(inputField.getText(), constructedTree.toString(), resultingString)); abacus.applyToContext(result.getResultingContext()); return resultingString; - } catch (ComputationInterruptedException exception) { - return ERR_STOP; - } catch (DomainException exception) { + } catch (ComputationInterruptedException | DomainException | EvaluationException exception) { return exception.getMessage(); } catch (RuntimeException exception) { exception.printStackTrace();