Extended mathjs
npm install @totemorg/mathjxExtends MathJS with the following scripting language:
if TEST
DO
elseif TEST
DO
:
else
DO
end
switch TEST
case TEST
DO
:
default
DO
end
try
DO
catch
DO
end
for INDEX
DO
end
while TEST
DO
end
until TEST
DO
end
when EVENT
DO
end
def f=(x,y, [a,b, ...], {u,v, ...}, ...)
DO
end
Inline functions are supported using fat-arrows:
(x,y, [a,b, ...], {u,v, ...}, ...) => {
DO
}
Because MathJS intrinsically protects against lax Matlab expressions, term-wise
evaluation of intrinsically singular functions like cos must use Cos([x,y,z...]) or map([x,y,z,...], cos).
Transposes are likewise strict, so [x,y,z,...]', [[x,y,z,...]]', and [x;y;z;...]' produce [x,y,z,...], [x;y;z,...], and [x,y,z,...], respectively.
Multiple MathJX lines be coded using DO \ DO \ ....
Evaluate MathJX scripts using:
$( "script", ctx => { / optional callback /
});
MathJX supports both MathJS tensors and native JS-style tensors:
var
A = $( [N1], function $ ( i, A ) { /.../ } ), // rank 1
B = $( [N1,N2], function $$ (i,j, B ) { /.../ } ), // rank 2
C = $( [N1,N2,...NK], ( [i,j,...], C ) => { /.../ } ) // rank K
where initialization callbacks are optional. Tensors are similarly indexed using:
A.$( (i, A) => { /.../ } ); // rank 1
B.$$( (i,j, B) => { /.../ } ); // rank 2
C.for( [i,j,...], C ) { /.../ } ); // rank K
npm install @totemorg/mathjx # Install
npm update
npm run start # Start/Unit test
npm run verminor # Roll minor version
npm run vermajor # Roll major version
npm run redoc # Regen documentation
npm run pubminor # republish as minor version
npm run pubmajor # republish as major version
Acquire and optionally configure MATHJX as follows:
import { JX } from "@totemorg/mathjx";
JX.config({
key: value, // set key
"key.key": value, // indexed set
"key.key.": value // indexed append
});
where configuration keys follow ENUMS deep copy conventions. See the
Program Reference for usage examples.
Process supplied mathjx-script by reducing the script to a mathjs script
using the following language model:
if TEST
BLOCK
elseif TEST
BLOCK
:
else
BLOCK
endswitch TEST
case TEST
BLOCK
:
default TEST
BLOCK
end
try
BLOCK
catch
BLOCK
end
for INDEX
BLOCK
end
while TEST
BLOCK
end
until TEST
BLOCK
end
when EVENT
BLOCK
end
def f=(x,y,...)
BLOCK
end
Inline functions are also supported using fat-arrows:
(x,y,...) => {
BLOCK
}
if TEST
BLOCK
elseif TEST
BLOCK
:
else
BLOCK
end
switch TEST
case TEST
BLOCK
:
default TEST
BLOCK
end
try
BLOCK
catch
BLOCK
end
for INDEX
BLOCK
end
while TEST
BLOCK
end
until TEST
BLOCK
end
when EVENT
BLOCK
end
def f=(x,y,...)
BLOCK
end
Inline functions are also supported using fat-arrows:
(x,y,...) => {
BLOCK
}
Requires: module:mathjs, module:enums, module:cp
Author: ACMESDS
| Param | Type | Description |
| --- | --- | --- |
| pgm | String \| Array | Script to reduce and execute. Use an Array to bypass default eol-tokenization. |
| blks | Array | Stash fo code blocks; initially []. |
| idx | Number | Current line index to start parsing; initially 0. |
| lang | Object | Language model; see code herein. |
Example (js-reduction)
``js
\\ program
def f=(x,y)
f=x+y;
end
\\ reduces to
def($ctx[1])
\\ with resulting context
[ { test: 'f=(x,y)', code: 'f=x+y\n' } ]
``
Example (js-reduction) js`
\\ program
for i
i1
i2
for j
j1; j2;
while u\u1\end
end
end
\\ reduces to
for($ctx[3])
\\ with resulting context
[
{ test: 'u', code: 'u1\n' },
{ test: 'j', code: 'j1; j2;\nwhile($ctx[1])' },
{ test: 'i', code: 'i1\ni2\nfor($ctx[2])' }
]`
Example (js-reduction) js`
\\ program
a1="this;is;a;test";
\\ reduces to
a1=$ctx[1];
\\ with resulting context
[ 'this;is;a;test' ]`
Example (js-reduction) js`
\\ program
somefn(1,2, \def f=(x,y)
print("x=%f and y=%f",x,y);
end
)
\\ and program
somefn(1,2, \(x,y) => {
print("x=%f and y=%f",x,y);
})
\\ reduces to
def($ctx[2]))
\\ with resulting context
[ 'x=%f and y=%f', { test: 'f=(x,y)', code: 'print($ctx[1],x,y);\n' } ]`
Example (js-reduction) js`
\\ program
def f=(x,y)
f=x+y;
end
disp(f(1,2));
\\ reduces to
def($ctx[1]);disp(f(1,2));
\\ with resulting context
[ { test: 'f=(x,y)', code: 'f=x+y;\n' } ]`
Example (js-reduction) js``
\\ program
def f=([a,b],{x,y})
f=x+y+a+b;
end
disp(f([4,5],{x:10,y:20}));
\\ reduces to
def($ctx[1]);disp(f([4,5],{x:10,y:20}));
\\ with resulting context
[ { test: 'f=([a,b],{x,y})', code: 'f=x+y+a+b;\n' } ]
* MATHJX
* ~_Errors
* .badBlock
* .noTerm
Kind: inner constant of MATHJX
* ~_Errors
* .badBlock
* .noTerm
#### _Errors.badBlock
Kind: static property of \_Errors
#### _Errors.noTerm
Kind: static property of \_Errors
* JX
* ~config(opts)
* ~get()
* ~toMathJS()
* ~toJS()
* ~isDefined()
* ~rank()
* ~size()
* ~len()
* ~disp()
* ~print()
* ~def()
* ~for()
* ~while()
* ~if()
* ~try()
* ~switch()
* ~when()
* ~until()
Kind: inner method of JX
| Param | Type | Description |
| --- | --- | --- |
| opts | Object | Options hash with keys following the deep-copy conventions |
JX Kind: inner method of JX
Kind: inner method of JX
JX Kind: inner method of JX
Kind: inner method of JX
Kind: inner method of JX
JX JX JX JX JX JX JX JX JX JX Feel free to
* submit and status TOTEM issues
* contribute to TOTEM notebooks
* revise TOTEM requirements
* browse TOTEM holdings
* or follow TOTEM milestones
*
© 2012 ACMESDS