mathjs 9.4.5 → 10.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/HISTORY.md +35 -0
- package/bin/cli.js +0 -0
- package/docs/expressions/syntax.md +46 -43
- package/docs/reference/functions/format.md +5 -2
- package/docs/reference/functions/parser.md +4 -4
- package/docs/reference/functions/setCartesian.md +3 -1
- package/lib/browser/math.js +5 -5
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/constants.js +1 -1
- package/lib/cjs/core/function/config.js +1 -1
- package/lib/cjs/core/function/import.js +2 -1
- package/lib/cjs/entry/dependenciesAny/dependenciesParserClass.generated.js +2 -2
- package/lib/cjs/entry/dependenciesAny.generated.js +999 -999
- package/lib/cjs/entry/dependenciesNumber/dependenciesParserClass.generated.js +2 -2
- package/lib/cjs/entry/dependenciesNumber.generated.js +581 -581
- package/lib/cjs/entry/impureFunctionsAny.generated.js +314 -313
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +223 -222
- package/lib/cjs/entry/mainAny.js +8 -8
- package/lib/cjs/entry/mainNumber.js +8 -8
- package/lib/cjs/entry/pureFunctionsAny.generated.js +1100 -1100
- package/lib/cjs/entry/pureFunctionsNumber.generated.js +375 -375
- package/lib/cjs/entry/typeChecks.js +12 -12
- package/lib/cjs/expression/Parser.js +6 -5
- package/lib/cjs/expression/embeddedDocs/function/set/setCartesian.js +1 -1
- package/lib/cjs/expression/function/parser.js +4 -4
- package/lib/cjs/expression/node/OperatorNode.js +9 -6
- package/lib/cjs/expression/operators.js +1 -1
- package/lib/cjs/expression/parse.js +42 -6
- package/lib/cjs/factoriesAny.js +660 -660
- package/lib/cjs/factoriesNumber.js +268 -237
- package/lib/cjs/function/set/setCartesian.js +3 -1
- package/lib/cjs/function/string/format.js +5 -2
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/plain/bignumber/arithmetic.js +2 -2
- package/lib/cjs/plain/number/arithmetic.js +10 -10
- package/lib/cjs/plain/number/constants.js +1 -1
- package/lib/cjs/plain/number/logical.js +1 -1
- package/lib/cjs/plain/number/probability.js +2 -1
- package/lib/cjs/plain/number/trigonometry.js +1 -1
- package/lib/cjs/plain/number/utils.js +1 -1
- package/lib/cjs/type/unit/physicalConstants.js +1 -1
- package/lib/cjs/utils/array.js +14 -14
- package/lib/cjs/utils/bignumber/bitwise.js +1 -1
- package/lib/cjs/utils/customs.js +5 -5
- package/lib/cjs/utils/factory.js +3 -3
- package/lib/cjs/utils/function.js +1 -1
- package/lib/cjs/utils/is.js +23 -23
- package/lib/cjs/utils/latex.js +2 -1
- package/lib/cjs/utils/map.js +3 -3
- package/lib/cjs/utils/noop.js +1 -1
- package/lib/cjs/utils/number.js +10 -6
- package/lib/cjs/utils/object.js +8 -8
- package/lib/cjs/utils/snapshot.js +1 -1
- package/lib/cjs/utils/string.js +2 -2
- package/lib/cjs/version.js +1 -1
- package/lib/esm/core/function/import.js +2 -1
- package/lib/esm/entry/dependenciesAny/dependenciesParserClass.generated.js +2 -2
- package/lib/esm/entry/dependenciesAny.generated.js +270 -270
- package/lib/esm/entry/dependenciesNumber/dependenciesParserClass.generated.js +2 -2
- package/lib/esm/entry/dependenciesNumber.generated.js +163 -163
- package/lib/esm/entry/impureFunctionsAny.generated.js +301 -301
- package/lib/esm/entry/impureFunctionsNumber.generated.js +211 -211
- package/lib/esm/entry/pureFunctionsAny.generated.js +816 -816
- package/lib/esm/entry/pureFunctionsNumber.generated.js +234 -234
- package/lib/esm/expression/Parser.js +6 -5
- package/lib/esm/expression/embeddedDocs/function/set/setCartesian.js +1 -1
- package/lib/esm/expression/function/parser.js +4 -4
- package/lib/esm/expression/node/OperatorNode.js +9 -6
- package/lib/esm/expression/parse.js +42 -6
- package/lib/esm/function/set/setCartesian.js +3 -1
- package/lib/esm/function/string/format.js +5 -2
- package/lib/esm/version.js +1 -1
- package/package.json +16 -16
- package/types/index.d.ts +281 -77
@@ -153,18 +153,6 @@ Object.defineProperty(exports, "isNumber", {
|
|
153
153
|
return _is.isNumber;
|
154
154
|
}
|
155
155
|
});
|
156
|
-
Object.defineProperty(exports, "isString", {
|
157
|
-
enumerable: true,
|
158
|
-
get: function get() {
|
159
|
-
return _is.isString;
|
160
|
-
}
|
161
|
-
});
|
162
|
-
Object.defineProperty(exports, "isUndefined", {
|
163
|
-
enumerable: true,
|
164
|
-
get: function get() {
|
165
|
-
return _is.isUndefined;
|
166
|
-
}
|
167
|
-
});
|
168
156
|
Object.defineProperty(exports, "isObject", {
|
169
157
|
enumerable: true,
|
170
158
|
get: function get() {
|
@@ -219,12 +207,24 @@ Object.defineProperty(exports, "isSparseMatrix", {
|
|
219
207
|
return _is.isSparseMatrix;
|
220
208
|
}
|
221
209
|
});
|
210
|
+
Object.defineProperty(exports, "isString", {
|
211
|
+
enumerable: true,
|
212
|
+
get: function get() {
|
213
|
+
return _is.isString;
|
214
|
+
}
|
215
|
+
});
|
222
216
|
Object.defineProperty(exports, "isSymbolNode", {
|
223
217
|
enumerable: true,
|
224
218
|
get: function get() {
|
225
219
|
return _is.isSymbolNode;
|
226
220
|
}
|
227
221
|
});
|
222
|
+
Object.defineProperty(exports, "isUndefined", {
|
223
|
+
enumerable: true,
|
224
|
+
get: function get() {
|
225
|
+
return _is.isUndefined;
|
226
|
+
}
|
227
|
+
});
|
228
228
|
Object.defineProperty(exports, "isUnit", {
|
229
229
|
enumerable: true,
|
230
230
|
get: function get() {
|
@@ -10,9 +10,9 @@ var _factory = require("../utils/factory.js");
|
|
10
10
|
var _map = require("../utils/map.js");
|
11
11
|
|
12
12
|
var name = 'Parser';
|
13
|
-
var dependencies = ['
|
13
|
+
var dependencies = ['evaluate'];
|
14
14
|
var createParserClass = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
|
15
|
-
var
|
15
|
+
var evaluate = _ref.evaluate;
|
16
16
|
|
17
17
|
/**
|
18
18
|
* @constructor Parser
|
@@ -44,7 +44,7 @@ var createParserClass = /* #__PURE__ */(0, _factory.factory)(name, dependencies,
|
|
44
44
|
* // define variables and functions
|
45
45
|
* parser.evaluate('x = 7 / 2') // 3.5
|
46
46
|
* parser.evaluate('x + 3') // 6.5
|
47
|
-
* parser.evaluate('
|
47
|
+
* parser.evaluate('f(x, y) = x^y') // f(x, y)
|
48
48
|
* parser.evaluate('f(2, 3)') // 8
|
49
49
|
*
|
50
50
|
* // get and set variables and functions
|
@@ -81,14 +81,15 @@ var createParserClass = /* #__PURE__ */(0, _factory.factory)(name, dependencies,
|
|
81
81
|
Parser.prototype.isParser = true;
|
82
82
|
/**
|
83
83
|
* Parse and evaluate the given expression
|
84
|
-
* @param {string} expr A string containing an expression,
|
84
|
+
* @param {string | string[]} expr A string containing an expression,
|
85
|
+
* for example "2+3", or a list with expressions
|
85
86
|
* @return {*} result The result, or undefined when the expression was empty
|
86
87
|
* @throws {Error}
|
87
88
|
*/
|
88
89
|
|
89
90
|
Parser.prototype.evaluate = function (expr) {
|
90
91
|
// TODO: validate arguments
|
91
|
-
return
|
92
|
+
return evaluate(expr, this.scope);
|
92
93
|
};
|
93
94
|
/**
|
94
95
|
* Get a variable (a function or variable) by name from the parsers scope.
|
@@ -8,7 +8,7 @@ var setCartesianDocs = {
|
|
8
8
|
name: 'setCartesian',
|
9
9
|
category: 'Set',
|
10
10
|
syntax: ['setCartesian(set1, set2)'],
|
11
|
-
description: 'Create the cartesian product of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.',
|
11
|
+
description: 'Create the cartesian product of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays and the values will be sorted in ascending order before the operation.',
|
12
12
|
examples: ['setCartesian([1, 2], [3, 4])'],
|
13
13
|
seealso: ['setUnion', 'setIntersect', 'setDifference', 'setPowerset']
|
14
14
|
};
|
@@ -31,10 +31,10 @@ var createParser = /* #__PURE__ */(0, _factory.factory)(name, dependencies, func
|
|
31
31
|
* const d = parser.evaluate('cos(45 deg)') // 0.7071067811865476
|
32
32
|
*
|
33
33
|
* // define variables and functions
|
34
|
-
* parser.evaluate('x = 7 / 2')
|
35
|
-
* parser.evaluate('x + 3')
|
36
|
-
* parser.evaluate('
|
37
|
-
* parser.evaluate('f(2, 3)')
|
34
|
+
* parser.evaluate('x = 7 / 2') // 3.5
|
35
|
+
* parser.evaluate('x + 3') // 6.5
|
36
|
+
* parser.evaluate('f(x, y) = x^y') // f(x, y)
|
37
|
+
* parser.evaluate('f(2, 3)') // 8
|
38
38
|
*
|
39
39
|
* // get and set variables and functions
|
40
40
|
* const x = parser.get('x') // 7
|
@@ -33,8 +33,9 @@ var createOperatorNode = /* #__PURE__ */(0, _factory.factory)(name, dependencies
|
|
33
33
|
* @param {string} fn Function name, for example 'add'
|
34
34
|
* @param {Node[]} args Operator arguments
|
35
35
|
* @param {boolean} [implicit] Is this an implicit multiplication?
|
36
|
+
* @param {boolean} [isPercentage] Is this an percentage Operation?
|
36
37
|
*/
|
37
|
-
function OperatorNode(op, fn, args, implicit) {
|
38
|
+
function OperatorNode(op, fn, args, implicit, isPercentage) {
|
38
39
|
if (!(this instanceof OperatorNode)) {
|
39
40
|
throw new SyntaxError('Constructor must be called with the new operator');
|
40
41
|
} // validate input
|
@@ -53,6 +54,7 @@ var createOperatorNode = /* #__PURE__ */(0, _factory.factory)(name, dependencies
|
|
53
54
|
}
|
54
55
|
|
55
56
|
this.implicit = implicit === true;
|
57
|
+
this.isPercentage = isPercentage === true;
|
56
58
|
this.op = op;
|
57
59
|
this.fn = fn;
|
58
60
|
this.args = args || [];
|
@@ -135,7 +137,7 @@ var createOperatorNode = /* #__PURE__ */(0, _factory.factory)(name, dependencies
|
|
135
137
|
args[i] = this._ifNode(callback(this.args[i], 'args[' + i + ']', this));
|
136
138
|
}
|
137
139
|
|
138
|
-
return new OperatorNode(this.op, this.fn, args, this.implicit);
|
140
|
+
return new OperatorNode(this.op, this.fn, args, this.implicit, this.isPercentage);
|
139
141
|
};
|
140
142
|
/**
|
141
143
|
* Create a clone of this node, a shallow copy
|
@@ -144,7 +146,7 @@ var createOperatorNode = /* #__PURE__ */(0, _factory.factory)(name, dependencies
|
|
144
146
|
|
145
147
|
|
146
148
|
OperatorNode.prototype.clone = function () {
|
147
|
-
return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit);
|
149
|
+
return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit, this.isPercentage);
|
148
150
|
};
|
149
151
|
/**
|
150
152
|
* Check whether this is an unary OperatorNode:
|
@@ -478,20 +480,21 @@ var createOperatorNode = /* #__PURE__ */(0, _factory.factory)(name, dependencies
|
|
478
480
|
op: this.op,
|
479
481
|
fn: this.fn,
|
480
482
|
args: this.args,
|
481
|
-
implicit: this.implicit
|
483
|
+
implicit: this.implicit,
|
484
|
+
isPercentage: this.isPercentage
|
482
485
|
};
|
483
486
|
};
|
484
487
|
/**
|
485
488
|
* Instantiate an OperatorNode from its JSON representation
|
486
489
|
* @param {Object} json An object structured like
|
487
|
-
* `{"mathjs": "OperatorNode", "op": "+", "fn": "add", "args": [...], "implicit": false}`,
|
490
|
+
* `{"mathjs": "OperatorNode", "op": "+", "fn": "add", "args": [...], "implicit": false, "isPercentage":false}`,
|
488
491
|
* where mathjs is optional
|
489
492
|
* @returns {OperatorNode}
|
490
493
|
*/
|
491
494
|
|
492
495
|
|
493
496
|
OperatorNode.fromJSON = function (json) {
|
494
|
-
return new OperatorNode(json.op, json.fn, json.args, json.implicit);
|
497
|
+
return new OperatorNode(json.op, json.fn, json.args, json.implicit, json.isPercentage);
|
495
498
|
};
|
496
499
|
/**
|
497
500
|
* Get HTML representation.
|
@@ -3,8 +3,8 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.getPrecedence = getPrecedence;
|
7
6
|
exports.getAssociativity = getAssociativity;
|
7
|
+
exports.getPrecedence = getPrecedence;
|
8
8
|
exports.isAssociativeWith = isAssociativeWith;
|
9
9
|
exports.properties = void 0;
|
10
10
|
|
@@ -1018,7 +1018,14 @@ var createParse = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
|
|
1018
1018
|
name = state.token;
|
1019
1019
|
fn = operators[name];
|
1020
1020
|
getTokenSkipNewline(state);
|
1021
|
-
|
1021
|
+
var rightNode = parseMultiplyDivide(state);
|
1022
|
+
|
1023
|
+
if (rightNode.isPercentage) {
|
1024
|
+
params = [node, new OperatorNode('*', 'multiply', [node, rightNode])];
|
1025
|
+
} else {
|
1026
|
+
params = [node, rightNode];
|
1027
|
+
}
|
1028
|
+
|
1022
1029
|
node = new OperatorNode(name, fn, params);
|
1023
1030
|
}
|
1024
1031
|
|
@@ -1039,9 +1046,7 @@ var createParse = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
|
|
1039
1046
|
'*': 'multiply',
|
1040
1047
|
'.*': 'dotMultiply',
|
1041
1048
|
'/': 'divide',
|
1042
|
-
'./': 'dotDivide'
|
1043
|
-
'%': 'mod',
|
1044
|
-
mod: 'mod'
|
1049
|
+
'./': 'dotDivide'
|
1045
1050
|
};
|
1046
1051
|
|
1047
1052
|
while (true) {
|
@@ -1099,7 +1104,7 @@ var createParse = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
|
|
1099
1104
|
|
1100
1105
|
|
1101
1106
|
function parseRule2(state) {
|
1102
|
-
var node =
|
1107
|
+
var node = parsePercentage(state);
|
1103
1108
|
var last = node;
|
1104
1109
|
var tokenStates = [];
|
1105
1110
|
|
@@ -1120,7 +1125,7 @@ var createParse = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
|
|
1120
1125
|
// Rewind once and build the "number / number" node; the symbol will be consumed later
|
1121
1126
|
(0, _extends2["default"])(state, tokenStates.pop());
|
1122
1127
|
tokenStates.pop();
|
1123
|
-
last =
|
1128
|
+
last = parsePercentage(state);
|
1124
1129
|
node = new OperatorNode('/', 'divide', [node, last]);
|
1125
1130
|
} else {
|
1126
1131
|
// Not a match, so rewind
|
@@ -1140,6 +1145,37 @@ var createParse = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
|
|
1140
1145
|
|
1141
1146
|
return node;
|
1142
1147
|
}
|
1148
|
+
/**
|
1149
|
+
* percentage or mod
|
1150
|
+
* @return {Node} node
|
1151
|
+
* @private
|
1152
|
+
*/
|
1153
|
+
|
1154
|
+
|
1155
|
+
function parsePercentage(state) {
|
1156
|
+
var node, name, fn, params;
|
1157
|
+
node = parseUnary(state);
|
1158
|
+
var operators = {
|
1159
|
+
'%': 'mod',
|
1160
|
+
mod: 'mod'
|
1161
|
+
};
|
1162
|
+
|
1163
|
+
while ((0, _object.hasOwnProperty)(operators, state.token)) {
|
1164
|
+
name = state.token;
|
1165
|
+
fn = operators[name];
|
1166
|
+
getTokenSkipNewline(state);
|
1167
|
+
|
1168
|
+
if (name === '%' && state.tokenType === TOKENTYPE.DELIMITER && state.token !== '(') {
|
1169
|
+
// If the expression contains only %, then treat that as /100
|
1170
|
+
node = new OperatorNode('/', 'divide', [node, new ConstantNode(100)], false, true);
|
1171
|
+
} else {
|
1172
|
+
params = [node, parseUnary(state)];
|
1173
|
+
node = new OperatorNode(name, fn, params);
|
1174
|
+
}
|
1175
|
+
}
|
1176
|
+
|
1177
|
+
return node;
|
1178
|
+
}
|
1143
1179
|
/**
|
1144
1180
|
* Unary plus and minus, and logical and bitwise not
|
1145
1181
|
* @return {Node} node
|