mirror of
https://github.com/josdejong/mathjs.git
synced 2026-01-25 15:07:57 +00:00
Some refactoring
This commit is contained in:
parent
050573f4f3
commit
edf4e24e21
@ -51,18 +51,18 @@ function factory (type, config, load, typed) {
|
||||
* the name of the argument, and the value is `true`.
|
||||
* The object may not be mutated, but must be
|
||||
* extended instead.
|
||||
* @return {string} js
|
||||
* @return {string} code
|
||||
* @private
|
||||
*/
|
||||
IndexNode.prototype._compile = function (defs, args) {
|
||||
var childArgs = Object.create(args);
|
||||
var sizeNeeded = this.ranges.some(IndexNode.containsEndSymbol);
|
||||
|
||||
var index = this.compileIndex(defs, childArgs);
|
||||
var compiledIndex = this.compileIndex(defs, childArgs);
|
||||
var index = compiledIndex.code;
|
||||
var object = this.object._compile(defs, childArgs);
|
||||
|
||||
// if some parameters use the 'end' parameter, we need to calculate the size
|
||||
if (sizeNeeded) {
|
||||
if (compiledIndex.sizeNeeded) {
|
||||
return '(function () {' +
|
||||
' var obj = ' + object + ';' +
|
||||
' var size = math.size(obj).valueOf();' +
|
||||
@ -83,9 +83,8 @@ function factory (type, config, load, typed) {
|
||||
* the name of the argument, and the value is `true`.
|
||||
* The object may not be mutated, but must be
|
||||
* extended instead.
|
||||
* @return {string} js
|
||||
* @return {{code: string, sizeNeeded: boolean}}
|
||||
*/
|
||||
// TODO: let compileIndex return an object which denotes whether the matrix size is needed
|
||||
IndexNode.prototype.compileIndex = function (defs, args) {
|
||||
// helper function to create a Range from start, step and end
|
||||
defs.range = function (start, end, step) {
|
||||
@ -144,7 +143,10 @@ function factory (type, config, load, typed) {
|
||||
}
|
||||
});
|
||||
|
||||
return 'math.index(' + ranges.join(', ') + ')';
|
||||
return {
|
||||
sizeNeeded: this.ranges.some(IndexNode.containsEndSymbol),
|
||||
code: 'math.index(' + ranges.join(', ') + ')'
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@ -47,38 +47,37 @@ function factory (type, config, load, typed) {
|
||||
* @private
|
||||
*/
|
||||
UpdateNode.prototype._compile = function (defs, args) {
|
||||
var symbol = this.index.filter(function (node) { return node.isSymbolNode; })[0];
|
||||
var sizeNeeded = this.index.ranges.some(IndexNode.containsEndSymbol);
|
||||
var multipleIndexes = this.index.object.isIndexNode;
|
||||
var replacement = this.expr._compile(defs, args);
|
||||
var compiledIndex = this.index.compileIndex(defs, args);
|
||||
var symbol = this.index.filter(function (node) {
|
||||
return node.isSymbolNode;
|
||||
})[0];
|
||||
var indexNodes = this.filter(function (node) {
|
||||
return node.isIndexNode;
|
||||
});
|
||||
|
||||
if (multipleIndexes || sizeNeeded) {
|
||||
if (indexNodes.length > 1 || compiledIndex.sizeNeeded) {
|
||||
// TODO: refactor this code, it's too complicated
|
||||
var childArgs = args;
|
||||
var code = this.index
|
||||
.filter(function (node) {
|
||||
return node.isIndexNode;
|
||||
})
|
||||
.reduce(function (code, node) {
|
||||
childArgs = Object.create(childArgs); // childArgs can be mutated by compileRanges
|
||||
var index = node.compileIndex(defs, childArgs);
|
||||
var sizeNeeded = node.ranges.some(IndexNode.containsEndSymbol);
|
||||
var code = indexNodes.reduce(function (code, node) {
|
||||
childArgs = Object.create(childArgs); // childArgs can be mutated by compileRanges
|
||||
var compiledIndex = node.compileIndex(defs, childArgs);
|
||||
var index = compiledIndex.code;
|
||||
var inner = code ? '(' + code + ')(math.subset(obj, index))' : replacement;
|
||||
|
||||
var inner = code ? '(' + code + ')(math.subset(obj, index))' : replacement;
|
||||
|
||||
return 'function (obj) {\n' +
|
||||
(sizeNeeded ? 'var size = math.size(obj).valueOf();\n' : '') +
|
||||
'var index = ' + index + ';\n' +
|
||||
'return math.subset(obj, index, ' + inner + ');\n' +
|
||||
'}';
|
||||
}, null);
|
||||
return 'function (obj) {\n' +
|
||||
(compiledIndex.sizeNeeded ? 'var size = math.size(obj).valueOf();\n' : '') +
|
||||
'var index = ' + index + ';\n' +
|
||||
'return math.subset(obj, index, ' + inner + ');\n' +
|
||||
'}';
|
||||
}, null);
|
||||
|
||||
return 'scope["' + symbol.name + '"] = (' + code + ')(' + symbol._compile(defs, args) + ')';
|
||||
}
|
||||
else {
|
||||
// simple, single subset replacement. No need for closures and nesting.
|
||||
var index = this.index.compileIndex(defs, args);
|
||||
// simple, single subset replacement. No need for closures and nesting stuff.
|
||||
var object = this.index.object._compile(defs, args);
|
||||
var index = compiledIndex.code;
|
||||
|
||||
return 'scope["' + symbol.name + '"] = ' +
|
||||
'math.subset(' + object + ', ' + index + ', ' + replacement + ')';
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user