From 44786282001f8a9cbae7ab8684e69f56ee9debfe Mon Sep 17 00:00:00 2001 From: Thaum Rystra Date: Fri, 15 May 2020 14:44:08 +0200 Subject: [PATCH] Reworked how bare symbols are handled, which should fix simplification --- .../afterComputation/evaluateString.js | 8 +++---- .../computation/evaluateCalculation.js | 4 ++-- .../utility/bareSymbolSubtitutor.js | 24 +++++++++++++++++++ .../replaceBareSymbolsWithValueAccessor.js | 22 ----------------- 4 files changed, 30 insertions(+), 28 deletions(-) create mode 100644 app/imports/api/creature/computation/utility/bareSymbolSubtitutor.js delete mode 100644 app/imports/api/creature/computation/utility/replaceBareSymbolsWithValueAccessor.js diff --git a/app/imports/api/creature/computation/afterComputation/evaluateString.js b/app/imports/api/creature/computation/afterComputation/evaluateString.js index 9c3150e0..98543fc2 100644 --- a/app/imports/api/creature/computation/afterComputation/evaluateString.js +++ b/app/imports/api/creature/computation/afterComputation/evaluateString.js @@ -1,5 +1,5 @@ import math from '/imports/math.js'; -import replaceBareSymbolsWithValueAccessor from '/imports/api/creature/computation/utility/replaceBareSymbolsWithValueAccessor.js'; +import bareSymbolSubtitutor from '/imports/api/creature/computation/utility/bareSymbolSubtitutor.js'; export default function evaluateString(string, scope){ let errors = []; @@ -20,7 +20,7 @@ export default function evaluateString(string, scope){ } // Replace all bare symbols with symbol.value - let transformedCalc = calc.transform(replaceBareSymbolsWithValueAccessor); + let transformedCalc = calc.transform(bareSymbolSubtitutor(scope)); // Evaluate the expression to a number or return with substitutions try { @@ -29,11 +29,11 @@ export default function evaluateString(string, scope){ } catch (e1){ errors.push(e1); try { - let result = simplifyWithAccessors(calc, scope).toHTML(); + let result = simplifyWithAccessors(transformedCalc, scope).toHTML(); return {result, errors}; } catch (e2){ errors.push(e2); - return {result: calc.toHTML(), errors}; + return {result: transformedCalc.toHTML(), errors}; } } } diff --git a/app/imports/api/creature/computation/evaluateCalculation.js b/app/imports/api/creature/computation/evaluateCalculation.js index d8446476..db34d15f 100644 --- a/app/imports/api/creature/computation/evaluateCalculation.js +++ b/app/imports/api/creature/computation/evaluateCalculation.js @@ -1,4 +1,4 @@ -import replaceBareSymbolsWithValueAccessor from '/imports/api/creature/computation/utility/replaceBareSymbolsWithValueAccessor.js'; +import bareSymbolSubtitutor from '/imports/api/creature/computation/utility/bareSymbolSubtitutor.js'; import computeStat from '/imports/api/creature/computation/computeStat.js'; import math from '/imports/math.js'; @@ -21,7 +21,7 @@ export default function evaluateCalculation(string, memo){ } }); // Ensure any bare symbols are value accessors instead - let substitutedCalc = calc.transform(replaceBareSymbolsWithValueAccessor); + let substitutedCalc = calc.transform(bareSymbolSubtitutor(memo.statsByVariableName)); // Evaluate the expression to a number or return with substitutions try { return substitutedCalc.evaluate(memo.statsByVariableName); diff --git a/app/imports/api/creature/computation/utility/bareSymbolSubtitutor.js b/app/imports/api/creature/computation/utility/bareSymbolSubtitutor.js new file mode 100644 index 00000000..cb0bccd2 --- /dev/null +++ b/app/imports/api/creature/computation/utility/bareSymbolSubtitutor.js @@ -0,0 +1,24 @@ +import math from '/imports/math.js'; + +export default function bareSymbolSubtitutor(scope){ + return function(node, path){ + if (!scope) return node; + if (node.isFunctionNode){ + let fn = node.fn; + if (fn && fn.isSymbolNode){ + fn.skipReplacement = true; + } + return node; + } else if ( + node.isSymbolNode && + path !== 'object' && + node.skipReplacement !== true + ) { + let stat = scope[node.name]; + if (!stat) return node; + return new math.ConstantNode(stat.value); + } else { + return node; + } + } +} diff --git a/app/imports/api/creature/computation/utility/replaceBareSymbolsWithValueAccessor.js b/app/imports/api/creature/computation/utility/replaceBareSymbolsWithValueAccessor.js deleted file mode 100644 index 4c48eb8e..00000000 --- a/app/imports/api/creature/computation/utility/replaceBareSymbolsWithValueAccessor.js +++ /dev/null @@ -1,22 +0,0 @@ -import math from '/imports/math.js'; - -export default function replaceBareSymbolsWithValueAccessor(node, path) { - if (node.isFunctionNode){ - let fn = node.fn; - if (fn && fn.isSymbolNode){ - fn.skipReplacement = true; - } - return node; - } else if ( - node.isSymbolNode && - path !== 'object' && - node.skipReplacement !== true - ) { - const object = new math.SymbolNode(node.name); - const address = new math.ConstantNode('value'); - const index = new math.IndexNode([address]); - return new math.AccessorNode(object, index); - } else { - return node; - } -}