mathjs 9.4.5 → 9.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HISTORY.md +9 -0
- package/docs/expressions/syntax.md +46 -43
- package/docs/reference/functions/setCartesian.md +3 -1
- package/lib/browser/math.js +3 -3
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/entry/dependenciesAny/dependenciesParserClass.generated.js +2 -2
- package/lib/cjs/entry/dependenciesNumber/dependenciesParserClass.generated.js +2 -2
- package/lib/cjs/entry/impureFunctionsAny.generated.js +1 -1
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +1 -1
- package/lib/cjs/expression/Parser.js +5 -4
- package/lib/cjs/expression/embeddedDocs/function/set/setCartesian.js +1 -1
- package/lib/cjs/expression/node/OperatorNode.js +9 -6
- package/lib/cjs/expression/parse.js +42 -6
- package/lib/cjs/function/set/setCartesian.js +3 -1
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/version.js +1 -1
- package/lib/esm/entry/dependenciesAny/dependenciesParserClass.generated.js +2 -2
- package/lib/esm/entry/dependenciesNumber/dependenciesParserClass.generated.js +2 -2
- package/lib/esm/entry/impureFunctionsAny.generated.js +1 -1
- package/lib/esm/entry/impureFunctionsNumber.generated.js +1 -1
- package/lib/esm/expression/Parser.js +5 -4
- package/lib/esm/expression/embeddedDocs/function/set/setCartesian.js +1 -1
- 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/version.js +1 -1
- package/package.json +1 -1
- package/types/index.d.ts +8 -8
| @@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", { | |
| 5 5 | 
             
            });
         | 
| 6 6 | 
             
            exports.ParserDependencies = void 0;
         | 
| 7 7 |  | 
| 8 | 
            -
            var  | 
| 8 | 
            +
            var _dependenciesEvaluateGenerated = require("./dependenciesEvaluate.generated.js");
         | 
| 9 9 |  | 
| 10 10 | 
             
            var _factoriesAny = require("../../factoriesAny.js");
         | 
| 11 11 |  | 
| @@ -14,7 +14,7 @@ var _factoriesAny = require("../../factoriesAny.js"); | |
| 14 14 | 
             
             * DON'T MAKE CHANGES HERE
         | 
| 15 15 | 
             
             */
         | 
| 16 16 | 
             
            var ParserDependencies = {
         | 
| 17 | 
            -
               | 
| 17 | 
            +
              evaluateDependencies: _dependenciesEvaluateGenerated.evaluateDependencies,
         | 
| 18 18 | 
             
              createParserClass: _factoriesAny.createParserClass
         | 
| 19 19 | 
             
            };
         | 
| 20 20 | 
             
            exports.ParserDependencies = ParserDependencies;
         | 
| @@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", { | |
| 5 5 | 
             
            });
         | 
| 6 6 | 
             
            exports.ParserDependencies = void 0;
         | 
| 7 7 |  | 
| 8 | 
            -
            var  | 
| 8 | 
            +
            var _dependenciesEvaluateGenerated = require("./dependenciesEvaluate.generated.js");
         | 
| 9 9 |  | 
| 10 10 | 
             
            var _factoriesNumber = require("../../factoriesNumber.js");
         | 
| 11 11 |  | 
| @@ -14,7 +14,7 @@ var _factoriesNumber = require("../../factoriesNumber.js"); | |
| 14 14 | 
             
             * DON'T MAKE CHANGES HERE
         | 
| 15 15 | 
             
             */
         | 
| 16 16 | 
             
            var ParserDependencies = {
         | 
| 17 | 
            -
               | 
| 17 | 
            +
              evaluateDependencies: _dependenciesEvaluateGenerated.evaluateDependencies,
         | 
| 18 18 | 
             
              createParserClass: _factoriesNumber.createParserClass
         | 
| 19 19 | 
             
            };
         | 
| 20 20 | 
             
            exports.ParserDependencies = ParserDependencies;
         | 
| @@ -195,7 +195,7 @@ var rationalize = (0, _factoriesAny.createRationalize)({ | |
| 195 195 | 
             
            });
         | 
| 196 196 | 
             
            exports.rationalize = rationalize;
         | 
| 197 197 | 
             
            var Parser = (0, _factoriesAny.createParserClass)({
         | 
| 198 | 
            -
               | 
| 198 | 
            +
              evaluate: evaluate
         | 
| 199 199 | 
             
            });
         | 
| 200 200 | 
             
            exports.Parser = Parser;
         | 
| 201 201 | 
             
            var help = (0, _factoriesAny.createHelp)({
         | 
| @@ -201,7 +201,7 @@ var help = (0, _factoriesNumber.createHelp)({ | |
| 201 201 | 
             
            });
         | 
| 202 202 | 
             
            exports.help = help;
         | 
| 203 203 | 
             
            var Parser = (0, _factoriesNumber.createParserClass)({
         | 
| 204 | 
            -
               | 
| 204 | 
            +
              evaluate: evaluate
         | 
| 205 205 | 
             
            });
         | 
| 206 206 | 
             
            exports.Parser = Parser;
         | 
| 207 207 | 
             
            var derivative = (0, _factoriesNumber.createDerivative)({
         | 
| @@ -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
         | 
| @@ -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 | 
             
            };
         | 
| @@ -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.
         | 
| @@ -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
         | 
| @@ -21,7 +21,8 @@ var createSetCartesian = /* #__PURE__ */(0, _factory.factory)(name, dependencies | |
| 21 21 |  | 
| 22 22 | 
             
              /**
         | 
| 23 23 | 
             
               * Create the cartesian product of two (multi)sets.
         | 
| 24 | 
            -
               * Multi-dimension arrays will be converted to single-dimension arrays | 
| 24 | 
            +
               * Multi-dimension arrays will be converted to single-dimension arrays
         | 
| 25 | 
            +
               * and the values will be sorted in ascending order before the operation.
         | 
| 25 26 | 
             
               *
         | 
| 26 27 | 
             
               * Syntax:
         | 
| 27 28 | 
             
               *
         | 
| @@ -30,6 +31,7 @@ var createSetCartesian = /* #__PURE__ */(0, _factory.factory)(name, dependencies | |
| 30 31 | 
             
               * Examples:
         | 
| 31 32 | 
             
               *
         | 
| 32 33 | 
             
               *    math.setCartesian([1, 2], [3, 4])        // returns [[1, 3], [1, 4], [2, 3], [2, 4]]
         | 
| 34 | 
            +
               *    math.setCartesian([4, 3], [2, 1])        // returns [[3, 1], [3, 2], [4, 1], [4, 2]]
         | 
| 33 35 | 
             
               *
         | 
| 34 36 | 
             
               * See also:
         | 
| 35 37 | 
             
               *
         | 
    
        package/lib/cjs/header.js
    CHANGED
    
    | @@ -6,8 +6,8 @@ | |
| 6 6 | 
             
             * It features real and complex numbers, units, matrices, a large set of
         | 
| 7 7 | 
             
             * mathematical functions, and a flexible expression parser.
         | 
| 8 8 | 
             
             *
         | 
| 9 | 
            -
             * @version 9. | 
| 10 | 
            -
             * @date    2021-09- | 
| 9 | 
            +
             * @version 9.5.0
         | 
| 10 | 
            +
             * @date    2021-09-22
         | 
| 11 11 | 
             
             *
         | 
| 12 12 | 
             
             * @license
         | 
| 13 13 | 
             
             * Copyright (C) 2013-2021 Jos de Jong <wjosdejong@gmail.com>
         | 
    
        package/lib/cjs/version.js
    CHANGED
    
    | @@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", { | |
| 4 4 | 
             
              value: true
         | 
| 5 5 | 
             
            });
         | 
| 6 6 | 
             
            exports.version = void 0;
         | 
| 7 | 
            -
            var version = '9. | 
| 7 | 
            +
            var version = '9.5.0'; // Note: This file is automatically generated when building math.js.
         | 
| 8 8 | 
             
            // Changes made in this file will be overwritten.
         | 
| 9 9 |  | 
| 10 10 | 
             
            exports.version = version;
         | 
| @@ -2,9 +2,9 @@ | |
| 2 2 | 
             
             * THIS FILE IS AUTO-GENERATED
         | 
| 3 3 | 
             
             * DON'T MAKE CHANGES HERE
         | 
| 4 4 | 
             
             */
         | 
| 5 | 
            -
            import {  | 
| 5 | 
            +
            import { evaluateDependencies } from './dependenciesEvaluate.generated.js';
         | 
| 6 6 | 
             
            import { createParserClass } from '../../factoriesAny.js';
         | 
| 7 7 | 
             
            export var ParserDependencies = {
         | 
| 8 | 
            -
               | 
| 8 | 
            +
              evaluateDependencies,
         | 
| 9 9 | 
             
              createParserClass
         | 
| 10 10 | 
             
            };
         | 
| @@ -2,9 +2,9 @@ | |
| 2 2 | 
             
             * THIS FILE IS AUTO-GENERATED
         | 
| 3 3 | 
             
             * DON'T MAKE CHANGES HERE
         | 
| 4 4 | 
             
             */
         | 
| 5 | 
            -
            import {  | 
| 5 | 
            +
            import { evaluateDependencies } from './dependenciesEvaluate.generated.js';
         | 
| 6 6 | 
             
            import { createParserClass } from '../../factoriesNumber.js';
         | 
| 7 7 | 
             
            export var ParserDependencies = {
         | 
| 8 | 
            -
               | 
| 8 | 
            +
              evaluateDependencies,
         | 
| 9 9 | 
             
              createParserClass
         | 
| 10 10 | 
             
            };
         | 
| @@ -1,10 +1,10 @@ | |
| 1 1 | 
             
            import { factory } from '../utils/factory.js';
         | 
| 2 2 | 
             
            import { createEmptyMap, toObject } from '../utils/map.js';
         | 
| 3 3 | 
             
            var name = 'Parser';
         | 
| 4 | 
            -
            var dependencies = [' | 
| 4 | 
            +
            var dependencies = ['evaluate'];
         | 
| 5 5 | 
             
            export var createParserClass = /* #__PURE__ */factory(name, dependencies, _ref => {
         | 
| 6 6 | 
             
              var {
         | 
| 7 | 
            -
                 | 
| 7 | 
            +
                evaluate
         | 
| 8 8 | 
             
              } = _ref;
         | 
| 9 9 |  | 
| 10 10 | 
             
              /**
         | 
| @@ -74,14 +74,15 @@ export var createParserClass = /* #__PURE__ */factory(name, dependencies, _ref = | |
| 74 74 | 
             
              Parser.prototype.isParser = true;
         | 
| 75 75 | 
             
              /**
         | 
| 76 76 | 
             
               * Parse and evaluate the given expression
         | 
| 77 | 
            -
               * @param {string} expr   A string containing an expression, | 
| 77 | 
            +
               * @param {string | string[]} expr   A string containing an expression,
         | 
| 78 | 
            +
               *                                   for example "2+3", or a list with expressions
         | 
| 78 79 | 
             
               * @return {*} result     The result, or undefined when the expression was empty
         | 
| 79 80 | 
             
               * @throws {Error}
         | 
| 80 81 | 
             
               */
         | 
| 81 82 |  | 
| 82 83 | 
             
              Parser.prototype.evaluate = function (expr) {
         | 
| 83 84 | 
             
                // TODO: validate arguments
         | 
| 84 | 
            -
                return  | 
| 85 | 
            +
                return evaluate(expr, this.scope);
         | 
| 85 86 | 
             
              };
         | 
| 86 87 | 
             
              /**
         | 
| 87 88 | 
             
               * Get a variable (a function or variable) by name from the parsers scope.
         | 
| @@ -2,7 +2,7 @@ export var setCartesianDocs = { | |
| 2 2 | 
             
              name: 'setCartesian',
         | 
| 3 3 | 
             
              category: 'Set',
         | 
| 4 4 | 
             
              syntax: ['setCartesian(set1, set2)'],
         | 
| 5 | 
            -
              description: 'Create the cartesian product of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.',
         | 
| 5 | 
            +
              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.',
         | 
| 6 6 | 
             
              examples: ['setCartesian([1, 2], [3, 4])'],
         | 
| 7 7 | 
             
              seealso: ['setUnion', 'setIntersect', 'setDifference', 'setPowerset']
         | 
| 8 8 | 
             
            };
         | 
| @@ -21,8 +21,9 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref | |
| 21 21 | 
             
               * @param {string} fn           Function name, for example 'add'
         | 
| 22 22 | 
             
               * @param {Node[]} args         Operator arguments
         | 
| 23 23 | 
             
               * @param {boolean} [implicit]  Is this an implicit multiplication?
         | 
| 24 | 
            +
               * @param {boolean} [isPercentage] Is this an percentage Operation?
         | 
| 24 25 | 
             
               */
         | 
| 25 | 
            -
              function OperatorNode(op, fn, args, implicit) {
         | 
| 26 | 
            +
              function OperatorNode(op, fn, args, implicit, isPercentage) {
         | 
| 26 27 | 
             
                if (!(this instanceof OperatorNode)) {
         | 
| 27 28 | 
             
                  throw new SyntaxError('Constructor must be called with the new operator');
         | 
| 28 29 | 
             
                } // validate input
         | 
| @@ -41,6 +42,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref | |
| 41 42 | 
             
                }
         | 
| 42 43 |  | 
| 43 44 | 
             
                this.implicit = implicit === true;
         | 
| 45 | 
            +
                this.isPercentage = isPercentage === true;
         | 
| 44 46 | 
             
                this.op = op;
         | 
| 45 47 | 
             
                this.fn = fn;
         | 
| 46 48 | 
             
                this.args = args || [];
         | 
| @@ -123,7 +125,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref | |
| 123 125 | 
             
                  args[i] = this._ifNode(callback(this.args[i], 'args[' + i + ']', this));
         | 
| 124 126 | 
             
                }
         | 
| 125 127 |  | 
| 126 | 
            -
                return new OperatorNode(this.op, this.fn, args, this.implicit);
         | 
| 128 | 
            +
                return new OperatorNode(this.op, this.fn, args, this.implicit, this.isPercentage);
         | 
| 127 129 | 
             
              };
         | 
| 128 130 | 
             
              /**
         | 
| 129 131 | 
             
               * Create a clone of this node, a shallow copy
         | 
| @@ -132,7 +134,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref | |
| 132 134 |  | 
| 133 135 |  | 
| 134 136 | 
             
              OperatorNode.prototype.clone = function () {
         | 
| 135 | 
            -
                return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit);
         | 
| 137 | 
            +
                return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit, this.isPercentage);
         | 
| 136 138 | 
             
              };
         | 
| 137 139 | 
             
              /**
         | 
| 138 140 | 
             
               * Check whether this is an unary OperatorNode:
         | 
| @@ -466,20 +468,21 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref | |
| 466 468 | 
             
                  op: this.op,
         | 
| 467 469 | 
             
                  fn: this.fn,
         | 
| 468 470 | 
             
                  args: this.args,
         | 
| 469 | 
            -
                  implicit: this.implicit
         | 
| 471 | 
            +
                  implicit: this.implicit,
         | 
| 472 | 
            +
                  isPercentage: this.isPercentage
         | 
| 470 473 | 
             
                };
         | 
| 471 474 | 
             
              };
         | 
| 472 475 | 
             
              /**
         | 
| 473 476 | 
             
               * Instantiate an OperatorNode from its JSON representation
         | 
| 474 477 | 
             
               * @param {Object} json  An object structured like
         | 
| 475 | 
            -
               *                       `{"mathjs": "OperatorNode", "op": "+", "fn": "add", "args": [...], "implicit": false}`,
         | 
| 478 | 
            +
               *                       `{"mathjs": "OperatorNode", "op": "+", "fn": "add", "args": [...], "implicit": false, "isPercentage":false}`,
         | 
| 476 479 | 
             
               *                       where mathjs is optional
         | 
| 477 480 | 
             
               * @returns {OperatorNode}
         | 
| 478 481 | 
             
               */
         | 
| 479 482 |  | 
| 480 483 |  | 
| 481 484 | 
             
              OperatorNode.fromJSON = function (json) {
         | 
| 482 | 
            -
                return new OperatorNode(json.op, json.fn, json.args, json.implicit);
         | 
| 485 | 
            +
                return new OperatorNode(json.op, json.fn, json.args, json.implicit, json.isPercentage);
         | 
| 483 486 | 
             
              };
         | 
| 484 487 | 
             
              /**
         | 
| 485 488 | 
             
               * Get HTML representation.
         | 
| @@ -1006,7 +1006,14 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => { | |
| 1006 1006 | 
             
                  name = state.token;
         | 
| 1007 1007 | 
             
                  fn = operators[name];
         | 
| 1008 1008 | 
             
                  getTokenSkipNewline(state);
         | 
| 1009 | 
            -
                   | 
| 1009 | 
            +
                  var rightNode = parseMultiplyDivide(state);
         | 
| 1010 | 
            +
             | 
| 1011 | 
            +
                  if (rightNode.isPercentage) {
         | 
| 1012 | 
            +
                    params = [node, new OperatorNode('*', 'multiply', [node, rightNode])];
         | 
| 1013 | 
            +
                  } else {
         | 
| 1014 | 
            +
                    params = [node, rightNode];
         | 
| 1015 | 
            +
                  }
         | 
| 1016 | 
            +
             | 
| 1010 1017 | 
             
                  node = new OperatorNode(name, fn, params);
         | 
| 1011 1018 | 
             
                }
         | 
| 1012 1019 |  | 
| @@ -1027,9 +1034,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => { | |
| 1027 1034 | 
             
                  '*': 'multiply',
         | 
| 1028 1035 | 
             
                  '.*': 'dotMultiply',
         | 
| 1029 1036 | 
             
                  '/': 'divide',
         | 
| 1030 | 
            -
                  './': 'dotDivide' | 
| 1031 | 
            -
                  '%': 'mod',
         | 
| 1032 | 
            -
                  mod: 'mod'
         | 
| 1037 | 
            +
                  './': 'dotDivide'
         | 
| 1033 1038 | 
             
                };
         | 
| 1034 1039 |  | 
| 1035 1040 | 
             
                while (true) {
         | 
| @@ -1087,7 +1092,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => { | |
| 1087 1092 |  | 
| 1088 1093 |  | 
| 1089 1094 | 
             
              function parseRule2(state) {
         | 
| 1090 | 
            -
                var node =  | 
| 1095 | 
            +
                var node = parsePercentage(state);
         | 
| 1091 1096 | 
             
                var last = node;
         | 
| 1092 1097 | 
             
                var tokenStates = [];
         | 
| 1093 1098 |  | 
| @@ -1109,7 +1114,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => { | |
| 1109 1114 | 
             
                        _extends(state, tokenStates.pop());
         | 
| 1110 1115 |  | 
| 1111 1116 | 
             
                        tokenStates.pop();
         | 
| 1112 | 
            -
                        last =  | 
| 1117 | 
            +
                        last = parsePercentage(state);
         | 
| 1113 1118 | 
             
                        node = new OperatorNode('/', 'divide', [node, last]);
         | 
| 1114 1119 | 
             
                      } else {
         | 
| 1115 1120 | 
             
                        // Not a match, so rewind
         | 
| @@ -1132,6 +1137,37 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => { | |
| 1132 1137 |  | 
| 1133 1138 | 
             
                return node;
         | 
| 1134 1139 | 
             
              }
         | 
| 1140 | 
            +
              /**
         | 
| 1141 | 
            +
               * percentage or mod
         | 
| 1142 | 
            +
               * @return {Node} node
         | 
| 1143 | 
            +
               * @private
         | 
| 1144 | 
            +
               */
         | 
| 1145 | 
            +
             | 
| 1146 | 
            +
             | 
| 1147 | 
            +
              function parsePercentage(state) {
         | 
| 1148 | 
            +
                var node, name, fn, params;
         | 
| 1149 | 
            +
                node = parseUnary(state);
         | 
| 1150 | 
            +
                var operators = {
         | 
| 1151 | 
            +
                  '%': 'mod',
         | 
| 1152 | 
            +
                  mod: 'mod'
         | 
| 1153 | 
            +
                };
         | 
| 1154 | 
            +
             | 
| 1155 | 
            +
                while (hasOwnProperty(operators, state.token)) {
         | 
| 1156 | 
            +
                  name = state.token;
         | 
| 1157 | 
            +
                  fn = operators[name];
         | 
| 1158 | 
            +
                  getTokenSkipNewline(state);
         | 
| 1159 | 
            +
             | 
| 1160 | 
            +
                  if (name === '%' && state.tokenType === TOKENTYPE.DELIMITER && state.token !== '(') {
         | 
| 1161 | 
            +
                    // If the expression contains only %, then treat that as /100
         | 
| 1162 | 
            +
                    node = new OperatorNode('/', 'divide', [node, new ConstantNode(100)], false, true);
         | 
| 1163 | 
            +
                  } else {
         | 
| 1164 | 
            +
                    params = [node, parseUnary(state)];
         | 
| 1165 | 
            +
                    node = new OperatorNode(name, fn, params);
         | 
| 1166 | 
            +
                  }
         | 
| 1167 | 
            +
                }
         | 
| 1168 | 
            +
             | 
| 1169 | 
            +
                return node;
         | 
| 1170 | 
            +
              }
         | 
| 1135 1171 | 
             
              /**
         | 
| 1136 1172 | 
             
               * Unary plus and minus, and logical and bitwise not
         | 
| 1137 1173 | 
             
               * @return {Node} node
         | 
| @@ -14,7 +14,8 @@ export var createSetCartesian = /* #__PURE__ */factory(name, dependencies, _ref | |
| 14 14 |  | 
| 15 15 | 
             
              /**
         | 
| 16 16 | 
             
               * Create the cartesian product of two (multi)sets.
         | 
| 17 | 
            -
               * Multi-dimension arrays will be converted to single-dimension arrays | 
| 17 | 
            +
               * Multi-dimension arrays will be converted to single-dimension arrays
         | 
| 18 | 
            +
               * and the values will be sorted in ascending order before the operation.
         | 
| 18 19 | 
             
               *
         | 
| 19 20 | 
             
               * Syntax:
         | 
| 20 21 | 
             
               *
         | 
| @@ -23,6 +24,7 @@ export var createSetCartesian = /* #__PURE__ */factory(name, dependencies, _ref | |
| 23 24 | 
             
               * Examples:
         | 
| 24 25 | 
             
               *
         | 
| 25 26 | 
             
               *    math.setCartesian([1, 2], [3, 4])        // returns [[1, 3], [1, 4], [2, 3], [2, 4]]
         | 
| 27 | 
            +
               *    math.setCartesian([4, 3], [2, 1])        // returns [[3, 1], [3, 2], [4, 1], [4, 2]]
         | 
| 26 28 | 
             
               *
         | 
| 27 29 | 
             
               * See also:
         | 
| 28 30 | 
             
               *
         | 
    
        package/lib/esm/version.js
    CHANGED
    
    | @@ -1,2 +1,2 @@ | |
| 1 | 
            -
            export var version = '9. | 
| 1 | 
            +
            export var version = '9.5.0'; // Note: This file is automatically generated when building math.js.
         | 
| 2 2 | 
             
            // Changes made in this file will be overwritten.
         | 
    
        package/package.json
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            {
         | 
| 2 2 | 
             
              "name": "mathjs",
         | 
| 3 | 
            -
              "version": "9. | 
| 3 | 
            +
              "version": "9.5.0",
         | 
| 4 4 | 
             
              "description": "Math.js is an extensive math library for JavaScript and Node.js. It features a flexible expression parser with support for symbolic computation, comes with a large set of built-in functions and constants, and offers an integrated solution to work with different data types like numbers, big numbers, complex numbers, fractions, units, and matrices.",
         | 
| 5 5 | 
             
              "author": "Jos de Jong <wjosdejong@gmail.com> (https://github.com/josdejong)",
         | 
| 6 6 | 
             
              "homepage": "https://mathjs.org",
         | 
    
        package/types/index.d.ts
    CHANGED
    
    | @@ -21,7 +21,7 @@ declare namespace math { | |
| 21 21 | 
             
              interface FactoryFunctionMap {
         | 
| 22 22 | 
             
                [key: string]: FactoryFunction<any> | FactoryFunctionMap;
         | 
| 23 23 | 
             
              }
         | 
| 24 | 
            -
             | 
| 24 | 
            +
             | 
| 25 25 |  | 
| 26 26 | 
             
              /** Available options for parse */
         | 
| 27 27 | 
             
              interface ParseOptions {
         | 
| @@ -1808,8 +1808,8 @@ declare namespace math { | |
| 1808 1808 |  | 
| 1809 1809 | 
             
                /**
         | 
| 1810 1810 | 
             
                 * Create the cartesian product of two (multi)sets. Multi-dimension
         | 
| 1811 | 
            -
                 * arrays will be converted to single-dimension arrays  | 
| 1812 | 
            -
                 * operation.
         | 
| 1811 | 
            +
                 * arrays will be converted to single-dimension arrays and the values
         | 
| 1812 | 
            +
                 * will be sorted in ascending order before the operation.
         | 
| 1813 1813 | 
             
                 * @param a1 A (multi)set
         | 
| 1814 1814 | 
             
                 * @param a2 A (multi)set
         | 
| 1815 1815 | 
             
                 * @returns The cartesian product of two (multi)sets
         | 
| @@ -2431,7 +2431,7 @@ declare namespace math { | |
| 2431 2431 |  | 
| 2432 2432 | 
             
                   /**
         | 
| 2433 2433 | 
             
                 * Test whether a value is an numeric value. In case of a string,
         | 
| 2434 | 
            -
                 *  true is returned if the string contains a numeric value. | 
| 2434 | 
            +
                 *  true is returned if the string contains a numeric value.
         | 
| 2435 2435 | 
             
                 * @param x Value to be tested
         | 
| 2436 2436 | 
             
                 * @returns Returns true when x is a number, BigNumber, Fraction, Boolean, or a String containing number.
         | 
| 2437 2437 | 
             
                 * Returns false for other types.
         | 
| @@ -2948,7 +2948,7 @@ declare namespace math { | |
| 2948 2948 | 
             
                toJSON(): MathJSON;
         | 
| 2949 2949 | 
             
                formatUnits(): string;
         | 
| 2950 2950 | 
             
                format(options: FormatOptions): string;
         | 
| 2951 | 
            -
                splitUnit(parts: ReadonlyArray<string | Unit>): Unit[]; | 
| 2951 | 
            +
                splitUnit(parts: ReadonlyArray<string | Unit>): Unit[];
         | 
| 2952 2952 | 
             
              }
         | 
| 2953 2953 |  | 
| 2954 2954 | 
             
              interface CreateUnitOptions {
         | 
| @@ -3155,7 +3155,7 @@ declare namespace math { | |
| 3155 3155 | 
             
              }
         | 
| 3156 3156 |  | 
| 3157 3157 | 
             
              interface Parser {
         | 
| 3158 | 
            -
                evaluate(expr: string): any;
         | 
| 3158 | 
            +
                evaluate(expr: string | string[]): any;
         | 
| 3159 3159 | 
             
                get(variable: string): any;
         | 
| 3160 3160 | 
             
                getAll(): { [key: string]: any };
         | 
| 3161 3161 | 
             
                set: (variable: string, value: any) => void;
         | 
| @@ -4303,8 +4303,8 @@ declare namespace math { | |
| 4303 4303 |  | 
| 4304 4304 | 
             
                /**
         | 
| 4305 4305 | 
             
                 * Create the cartesian product of two (multi)sets. Multi-dimension
         | 
| 4306 | 
            -
                 * arrays will be converted to single-dimension arrays  | 
| 4307 | 
            -
                 * operation.
         | 
| 4306 | 
            +
                 * arrays will be converted to single-dimension arrays and the values
         | 
| 4307 | 
            +
                 * will be sorted in ascending order before the operation.
         | 
| 4308 4308 | 
             
                 * @param a2 A (multi)set
         | 
| 4309 4309 | 
             
                 */
         | 
| 4310 4310 | 
             
                setCartesian(a2: MathArray | Matrix): MathJsChain;
         |