mirror of
https://github.com/josdejong/mathjs.git
synced 2026-01-18 14:59:29 +00:00
59 lines
1.7 KiB
JavaScript
59 lines
1.7 KiB
JavaScript
'use strict';
|
|
|
|
function factory(type, config, load, typed, math) {
|
|
var Node = math.expression.node.Node;
|
|
var ConstantNode = math.expression.node.ConstantNode;
|
|
var OperatorNode = math.expression.node.OperatorNode;
|
|
var FunctionNode = math.expression.node.FunctionNode;
|
|
var ParenthesisNode = math.expression.node.ParenthesisNode;
|
|
|
|
const node0 = new ConstantNode(0);
|
|
const node1 = new ConstantNode(1);
|
|
|
|
/**
|
|
* resolve(expr, scope) replaces variable nodes with their scoped values
|
|
*
|
|
* Syntax:
|
|
*
|
|
* simplify.resolve(expr, scope)
|
|
*
|
|
* Examples:
|
|
*
|
|
* math.simplify.resolve('x + y', {x:1, y:2}) // Node {1 + 2}
|
|
* math.simplify.resolve(math.parse('x+y'), {x:1, y:2}) // Node {1 + 2}
|
|
* math.simplify('x+y', {x:2, y:'x+x'}).toString(); // "6"
|
|
*
|
|
* @param {Node} node
|
|
* The expression tree to be simplified
|
|
*/
|
|
function resolve(node, scope) {
|
|
if (scope == null) {
|
|
return node;
|
|
}
|
|
if (node.isSymbolNode) {
|
|
var value = scope[node.name];
|
|
if (value instanceof Node) {
|
|
return resolve(value, scope);
|
|
} else if (typeof value === 'number') {
|
|
return math.parse(`${value}`);
|
|
}
|
|
} else if (node.isOperatorNode) {
|
|
var args = node.args.map((arg) => resolve(arg, scope));
|
|
return new OperatorNode(node.op, node.fn, args);
|
|
} else if (node.isParenthesisNode) {
|
|
return new ParenthesisNode(resolve(node.content, scope));
|
|
} else if (node.isFunctionNode) {
|
|
var args = node.args.map((arg) => resolve(arg, scope));
|
|
return new FunctionNode(node.name, args);
|
|
}
|
|
return node;
|
|
}
|
|
|
|
return resolve;
|
|
}
|
|
|
|
exports.math = true;
|
|
exports.name = 'resolve';
|
|
exports.path = 'algebra.simplify';
|
|
exports.factory = factory;
|