subscript 5.2.3 → 5.4.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/README.md CHANGED
@@ -24,13 +24,13 @@ _Subscript_ is designed to be useful for:
24
24
 
25
25
  * templates (perfect match with [template parts](https://github.com/github/template-parts))
26
26
  * expressions evaluators, calculators
27
- * subsets of languages (eg. [justin](#justin)) <!-- see sonr, mineural -->
28
- * mocking language features (eg. pipe operator)
27
+ * configurable subsets of languages (eg. [justin](#justin)) <!-- see sonr, mineural -->
28
+ * pluggable/mock language features (eg. pipe operator)
29
29
  * sandboxes, playgrounds, safe eval
30
30
  * custom DSL
31
31
 
32
32
  [_Jsep_](https://github.com/EricSmekens/jsep) is generally fine for the listed tasks, unless you need dependencies as small as possible.
33
- _Subscript_ has [2.5kb](https://npmfs.com/package/subscript/5.2.0/subscript.min.js) footprint vs [11.4kb](https://npmfs.com/package/jsep/1.2.0/dist/jsep.min.js) _jsep_, with _jsep+_ test coverage and better performance.
33
+ _Subscript_ has [2.5kb](https://npmfs.com/package/subscript/5.2.0/subscript.min.js) footprint vs [11.4kb](https://npmfs.com/package/jsep/1.2.0/dist/jsep.min.js) _jsep_ + [4.5kb](https://npmfs.com/package/expression-eval/5.0.0/dist/expression-eval.module.js) _expression-eval_, with _jsep_ test coverage and better performance.
34
34
 
35
35
 
36
36
  ## Evaluation
@@ -77,7 +77,7 @@ import { parse, evaluate } from 'subscript.js'
77
77
  parse.operator('=>', 10) // precedence=10, type=default (0 - binary, 1 - postfix, -1 - prefix)
78
78
 
79
79
  evaluate.operator('=>', ( args, body ) => evaluate(body, args))
80
- evaluate.operator('|', ( a, ...b ) => a.pipe(...b))
80
+ evaluate.operator('|', ( a, b ) => a.pipe(b))
81
81
 
82
82
  let tree = parse(`
83
83
  interval(350)
package/evaluate.js CHANGED
@@ -1,25 +1,21 @@
1
- export const isCmd = a => Array.isArray(a) && (typeof a[0] === 'string' || isCmd(a[0])),
2
-
3
1
  // calltree → result
4
- evaluate = (s, ctx={}, c, op) => {
5
- if (isCmd(s)) {
6
- c = s[0]
7
- if (typeof c === 'string') op = lookup[c]
8
- c = op || evaluate(c, ctx) // [[a,b], c]
9
- if (typeof c !== 'function') return c
10
- return c.call(...s.map(a => evaluate(a,ctx)))
2
+ export const evaluate = (node, ctx={}) => {
3
+ if (typeof node === 'string')
4
+ return node[0] === '"' ? node.slice(1,-1) : node[0]==='@' ? node.slice(1) : node in ctx ? ctx[node] : node
5
+
6
+ if (Array.isArray(node)) {
7
+ // [[a,b], c] or ['+', a, b] or ['myfn', a, b], or
8
+ let c = node[0], fn = Array.isArray(c) ? evaluate(c, ctx) : (lookup[c] || ctx[c] || c), args=[], i = 1
9
+ for (;i<node.length;i++) args.push(evaluate(node[i], ctx))
10
+ return args.length > fn.length && fn.length ? args.reduce(fn) : fn.apply(c,args)
11
11
  }
12
- if (s && typeof s === 'string')
13
- return s[0] === '"' ? s.slice(1,-1)
14
- : s[0]==='@' ? s.slice(1)
15
- : s in ctx ? ctx[s] : s
16
12
 
17
- return s
13
+ return node
18
14
  },
19
15
  lookup = {},
20
16
 
21
17
  // op evaluators
22
18
  // multiple args allows shortcuts, lisp compatible, easy manual eval, functions anyways take multiple arguments
23
- operator = evaluate.operator = (op, fn) => lookup[op] = fn.length == 2 ? (...a)=>a.reduce(fn) : fn
19
+ operator = evaluate.operator = (op, fn) => lookup[op] = fn
24
20
 
25
21
  export default evaluate
package/justin.js CHANGED
@@ -111,15 +111,15 @@ addOps(parse.operator, 3, [
111
111
  '.', PREC_CALL, (node,b) => node && [skip(),node, typeof (b = expr(PREC_CALL)) === 'string' ? '"' + b + '"' : b.valueOf()],
112
112
 
113
113
  // a[b]
114
- '[', PREC_CALL, (node) => (skip(), node = ['.', node, val(expr(0,CBRACK))], skip(), node),
114
+ '[', PREC_CALL, (node) => (skip(), node = ['.', node, val(expr(0,CBRACK))], node),
115
115
  ']',,,
116
116
 
117
117
  // a(b)
118
- '(', PREC_CALL, (node,b) => ( skip(), b=expr(0,CPAREN), skip(),
118
+ '(', PREC_CALL, (node,b) => ( skip(), b=expr(0,CPAREN),
119
119
  Array.isArray(b) && b[0]===',' ? (b[0]=node, b) : b ? [node, val(b)] : [node]
120
120
  ),
121
121
  // (a+b)
122
- '(', PREC_GROUP, (node,b) => !node && (skip(), b=expr(0,CPAREN) || err(), skip(), b),
122
+ '(', PREC_GROUP, (node,b) => !node && (skip(), b=expr(0,CPAREN) || err(), b),
123
123
  ')',,,
124
124
 
125
125
  // justin extension
@@ -132,23 +132,21 @@ addOps(parse.operator, 3, [
132
132
  if (!node) err('Expected expression')
133
133
  let a, b
134
134
  skip(), parse.space(), a = expr()
135
- if (code() !== 58) err('Expected :')
136
- skip(), parse.space(), b = expr()
137
- return ['?:', node, a, b]
135
+ return ['?:', node, a[1], a[2]]
138
136
  },
139
137
  '}',,,
140
- ':',,,
138
+ ':',2,,
141
139
  'in', PREC_COMP, (node) => code(2) <= 32 && [skip(2), '"'+node+'"', expr(PREC_COMP)],
142
140
 
143
141
  // as operator it's faster to lookup (no need to extra rule check), smaller and no conflict with word names
144
142
  // [a,b,c]
145
143
  '[', PREC_TOKEN, (node,arg) => !node && (
146
- skip(), arg=expr(0,93), skip(),
144
+ skip(), arg=expr(0,93),
147
145
  !arg ? ['['] : arg[0] == ',' ? (arg[0]='[',arg) : ['[',arg]
148
146
  ),
149
147
 
150
148
  // {a:0, b:1}
151
- '{', PREC_TOKEN, (node,arg) => !node && (skip(), arg=expr(0,125), skip(),
149
+ '{', PREC_TOKEN, (node,arg) => !node && (skip(), arg=expr(0,125),
152
150
  !arg ? ['{'] : arg[0] == ':' ? ['{',arg] : arg[0] == ',' ? (arg[0]='{',arg) : ['{',arg])
153
151
  ,
154
152
 
@@ -172,8 +170,8 @@ addOps(evaluate.operator, 2, [
172
170
  '/', (a,b)=>a/b,
173
171
  '*', (a,b)=>a*b,
174
172
 
175
- '+', (a,b)=>a+b,
176
- '-', (...a)=>a.length < 2 ? -a : a.reduce((a,b)=>a-b),
173
+ '+', (a,b=0)=>a+b,
174
+ '-', (a,b)=>b==null ? -a : a-b,
177
175
 
178
176
  '>>>', (a,b)=>a>>>b,
179
177
  '>>', (a,b)=>a>>b,
package/justin.min.js CHANGED
@@ -1 +1 @@
1
- var e,r,t=e=>Array.isArray(e)&&("string"==typeof e[0]||t(e[0])),a=(e,r={},o,s)=>t(e)?("string"==typeof(o=e[0])&&(s=n[o]),"function"!=typeof(o=s||a(o,r))?o:o.call(...e.map((e=>a(e,r))))):e&&"string"==typeof e?'"'===e[0]?e.slice(1,-1):"@"===e[0]?e.slice(1):e in r?r[e]:e:e,n={},o=(a.operator=(e,r)=>n[e]=2==r.length?(...e)=>e.reduce(r):r,(t,a)=>(r=t,e=0,a=p(),e<r.length?s():d(a))),s=(t="Bad syntax")=>{throw Error(t+" `"+r[e]+"` at "+e)},f=(t=1,a=e)=>{if("number"==typeof t)e+=t;else for(;t(i());)e++;return r.slice(a,e)},i=(t=0)=>r.charCodeAt(e+t),l=(t=1)=>r.substr(e,t),p=(e=0,r,t,a,n=0,f,i)=>{for(;(t=o.space())&&(i=y[t]?.(a,e)||!a&&c(t));)a=i;return r&&t!==r&&s("Unclosed paren"),a},u=(o.space=r=>{for(;(r=i())<=32;)e++;return r},o.token=[]),c=(e,r=0,t)=>{for(;r<u.length;)if(t=u[r++](e))return t},y=[],d=(o.operator=(r,t=0,a=0,n,u=r.charCodeAt(0),c=r.length,h=y[u],v=a<=0&&r.toUpperCase()!==r)=>(n=a?a>0?e=>e&&[f(c),d(e)]:a<0?e=>!e&&[f(c),d(p(t-1))]:a:a=>{a=[r,a||s()];do{e+=c,a.push(d(p(t)))}while(o.space()==u&&(c<2||l(c)==r)&&(!v||i(c)<=32));return a},y[u]=(e,a)=>a<t&&(c<2||l(c)==r)&&(!v||i(c)<=32)&&n(e)||h&&h(e,a)),e=>Array.isArray(e)?e:(e||s()).valueOf()),h=10,v=15,g=20;o.token.push((e=>(e=f((e=>e>47&&e<58||46==e)))&&((69==i()||101==i())&&(e+=f(2)+f((e=>e>=48&&e<=57))),isNaN(e=new Number(e))?s("Bad number"):e)),((e,r,t,a)=>{if(34===e||39===e){for(r=l(),f(),a="";(t=i())-e;)92===t?(f(),a+=A[l()]||l()):a+=l(),f();return f(),r+a+r}}),(e=>f((e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>=192&&215!=e&&247!=e))));var A={n:"\n",r:"\r",t:"\t",b:"\b",f:"\f",v:"\v"};o.space=e=>{for(;(e=i())<=32||47===e;)if(e<=32)f();else if(47===e)if(42===i(1))f(2),f((e=>42!==e&&47!==i(1))),f(2);else{if(47!==i(1))break;f(2),f((e=>e>=32))}return e};var b=(e,r=2,t)=>{for(let a=0;a<t.length;a+=r)e(t[a],t[a+1],t[a+2])};b(o.operator,3,[",",1,,"|",6,,"||",4,,"&",8,,"&&",5,,"^",7,,"==",9,,"!=",9,,">",h,,">=",h,,">>",11,,">>>",11,,"<",h,,"<=",h,,"<<",11,,"+",12,,"+",v,-1,"++",v,-1,"++",v,1,"-",12,,"-",v,-1,"--",v,-1,"--",v,1,"!",v,-1,"*",13,,"/",13,,"%",13,,".",18,(e,r)=>e&&[f(),e,"string"==typeof(r=p(18))?'"'+r+'"':r.valueOf()],"[",18,e=>(f(),e=[".",e,d(p(0,93))],f(),e),"]",,,"(",18,(e,r)=>(f(),r=p(0,41),f(),Array.isArray(r)&&","===r[0]?(r[0]=e,r):r?[e,d(r)]:[e]),"(",19,(e,r)=>!e&&(f(),r=p(0,41)||s(),f(),r),")",,,";",1,,"===",9,,"!==",9,,"**",14,,"~",v,-1,"?",3,e=>{let r,t;return e||s("Expected expression"),f(),o.space(),r=p(),58!==i()&&s("Expected :"),f(),o.space(),t=p(),["?:",e,r,t]},"}",,,":",,,"in",h,e=>i(2)<=32&&[f(2),'"'+e+'"',p(h)],"[",g,(e,r)=>!e&&(f(),r=p(0,93),f(),r?","==r[0]?(r[0]="[",r):["[",r]:["["]),"{",g,(e,r)=>!e&&(f(),r=p(0,125),f(),r?":"==r[0]?["{",r]:","==r[0]?(r[0]="{",r):["{",r]:["{"]),"null",g,e=>!e&&(f(4),m(null)),"false",g,e=>!e&&(f(5),m(!1)),"true",g,e=>!e&&(f(4),m(!0)),"undefined",g,e=>!e&&(f(9),m(void 0))]);var m=e=>({valueOf:()=>e});b(a.operator,2,["!",e=>!e,"++",e=>++e,"--",e=>--e,".",(e,r)=>e&&e[r],"%",(e,r)=>e%r,"/",(e,r)=>e/r,"*",(e,r)=>e*r,"+",(e,r)=>e+r,"-",(...e)=>e.length<2?-e:e.reduce(((e,r)=>e-r)),">>>",(e,r)=>e>>>r,">>",(e,r)=>e>>r,"<<",(e,r)=>e<<r,">=",(e,r)=>e>=r,">",(e,r)=>e>r,"<=",(e,r)=>e<=r,"<",(e,r)=>e<r,"!=",(e,r)=>e!=r,"==",(e,r)=>e==r,"&",(e,r)=>e&r,"^",(e,r)=>e^r,"|",(e,r)=>e|r,"&&",(...e)=>e.every(Boolean),"||",(...e)=>e.some(Boolean),",",(e,r)=>r,"**",(...e)=>e.reduceRight(((e,r)=>Math.pow(r,e))),"~",e=>~e,"?:",(e,r,t)=>e?r:t,"in",(e,r)=>e in r,"[",(...e)=>Array(...e),"{",(...e)=>Object.fromEntries(e),":",(e,r)=>[e,r]]);var x=e=>(e="string"==typeof e?o(e):e,r=>a(e,r));export{x as default,a as evaluate,o as parse};
1
+ const e=(t,n={},o,s)=>{if("string"==typeof t)return'"'===t[0]?t.slice(1,-1):"@"===t[0]?t.slice(1):t in n?n[t]:t;if(Array.isArray(t)&&("string"==typeof t[0]||Array.isArray(t[0]))){let[o,...s]=t,a="string"==typeof o?r[o]||n[o]:e(o,n);return s=s.map((r=>e(r,n))),a.apply(o,s)}return t},r={};let t,n;e.operator=(e,t)=>r[e]=2==t.length?(...e)=>e.reduce(t):t;const o=(e,r)=>(n=e,t=0,r=l(),t<n.length?s():y(r)),s=(e="Bad syntax")=>{throw Error(e+" `"+n[t]+"` at "+t)},a=(e=1,r=t)=>{if("number"==typeof e)t+=e;else for(;e(i());)t++;return n.slice(r,t)},i=(e=0)=>n.charCodeAt(t+e),f=(e=1)=>n.substr(t,e),l=(e=0,r,n,a,i=0,f,l)=>{for(;(n=o.space())&&(l=c[n]?.(a,e)||!a&&p(n));)a=l;return r&&(n!=r?s("Unclosed paren"):t++),a};o.space=e=>{for(;(e=i())<=32;)t++;return e};const u=o.token=[],p=(e,r=0,t)=>{for(;r<u.length;)if(t=u[r++](e))return t},c=[];o.operator=(e,r=0,n=0,s,u=e.charCodeAt(0),p=e.length,d=c[u],h=n<=0&&e.toUpperCase()!==e)=>(s=n?n>0?e=>e&&[a(p),y(e)]:n<0?e=>!e&&[a(p),y(l(r-1))]:n:n=>{n=[e,y(n)];do{t+=p,n.push(y(l(r)))}while(o.space()==u&&(p<2||f(p)==e)&&(!h||i(p)<=32));return n},c[u]=(t,n)=>n<r&&(p<2||f(p)==e)&&(!h||i(p)<=32)&&s(t)||d&&d(t,n));const y=e=>Array.isArray(e)?e:(e||s()).valueOf();o.token.push((e=>(e=a((e=>e>47&&e<58||46==e)))&&((69==i()||101==i())&&(e+=a(2)+a((e=>e>=48&&e<=57))),isNaN(e=new Number(e))?s("Bad number"):e)),((e,r,t,n)=>{if(34===e||39===e){for(r=f(),a(),n="";(t=i())-e;)92===t?(a(),n+=d[f()]||f()):n+=f(),a();return a(),r+n+r}}),(e=>a((e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>=192&&215!=e&&247!=e))));const d={n:"\n",r:"\r",t:"\t",b:"\b",f:"\f",v:"\v"};o.space=e=>{for(;(e=i())<=32||47===e;)if(e<=32)a();else if(47===e)if(42===i(1))a(2),a((e=>42!==e&&47!==i(1))),a(2);else{if(47!==i(1))break;a(2),a((e=>e>=32))}return e};const h=(e,r=2,t)=>{for(let n=0;n<t.length;n+=r)e(t[n],t[n+1],t[n+2])};h(o.operator,3,[",",1,,"|",6,,"||",4,,"&",8,,"&&",5,,"^",7,,"==",9,,"!=",9,,">",10,,">=",10,,">>",11,,">>>",11,,"<",10,,"<=",10,,"<<",11,,"+",12,,"+",15,-1,"++",15,-1,"++",15,1,"-",12,,"-",15,-1,"--",15,-1,"--",15,1,"!",15,-1,"*",13,,"/",13,,"%",13,,".",18,(e,r)=>e&&[a(),e,"string"==typeof(r=l(18))?'"'+r+'"':r.valueOf()],"[",18,e=>(a(),[".",e,y(l(0,93))]),"]",,,"(",18,(e,r)=>(a(),r=l(0,41),Array.isArray(r)&&","===r[0]?(r[0]=e,r):r?[e,y(r)]:[e]),"(",19,(e,r)=>!e&&(a(),l(0,41)||s()),")",,,";",1,,"===",9,,"!==",9,,"**",14,,"~",15,-1,"?",3,e=>{let r;return e||s("Expected expression"),a(),o.space(),r=l(),["?:",e,r[1],r[2]]},"}",,,":",2,,"in",10,e=>i(2)<=32&&[a(2),'"'+e+'"',l(10)],"[",20,(e,r)=>!e&&(a(),(r=l(0,93))?","==r[0]?(r[0]="[",r):["[",r]:["["]),"{",20,(e,r)=>!e&&(a(),(r=l(0,125))?":"==r[0]?["{",r]:","==r[0]?(r[0]="{",r):["{",r]:["{"]),"null",20,e=>!e&&(a(4),g(null)),"false",20,e=>!e&&(a(5),g(!1)),"true",20,e=>!e&&(a(4),g(!0)),"undefined",20,e=>!e&&(a(9),g(void 0))]);const g=e=>({valueOf:()=>e});h(e.operator,2,["!",e=>!e,"++",e=>++e,"--",e=>--e,".",(e,r)=>e?e[r]:e,"%",(e,r)=>e%r,"/",(e,r)=>e/r,"*",(e,r)=>e*r,"+",(e,r)=>e+r,"-",(...e)=>e.length<2?-e:e.reduce(((e,r)=>e-r)),">>>",(e,r)=>e>>>r,">>",(e,r)=>e>>r,"<<",(e,r)=>e<<r,">=",(e,r)=>e>=r,">",(e,r)=>e>r,"<=",(e,r)=>e<=r,"<",(e,r)=>e<r,"!=",(e,r)=>e!=r,"==",(e,r)=>e==r,"&",(e,r)=>e&r,"^",(e,r)=>e^r,"|",(e,r)=>e|r,"&&",(...e)=>e.every(Boolean),"||",(...e)=>e.some(Boolean),",",(e,r)=>r,"**",(...e)=>e.reduceRight(((e,r)=>Math.pow(r,e))),"~",e=>~e,"?:",(e,r,t)=>e?r:t,"in",(e,r)=>e in r,"[",(...e)=>Array(...e),"{",(...e)=>Object.fromEntries(e),":",(e,r)=>[e,r]]);var A=r=>(r="string"==typeof r?o(r):r,t=>e(r,t));export{A as default,e as evaluate,o as parse};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "subscript",
3
- "version": "5.2.3",
3
+ "version": "5.4.0",
4
4
  "description": "Microlanguage with common syntax for JS/C++/Python/Rust",
5
5
  "main": "subscript.js",
6
6
  "type": "module",
@@ -18,9 +18,9 @@
18
18
  "test": "test"
19
19
  },
20
20
  "scripts": {
21
- "build": "esbuild subscript.js --bundle --format=esm --minify --outfile=subscript.min.js",
21
+ "build": "rollup subscript.js --file subscript.min.js --format esm --name \"Subscript\"",
22
22
  "minify": "terser subscript.min.js -o subscript.min.js --module -c passes=3 -m",
23
- "build-justin": "esbuild justin.js --bundle --format=esm --minify --outfile=justin.min.js",
23
+ "build-justin": "rollup justin.js --file justin.min.js --format esm --name \"Justin\"",
24
24
  "minify-justin": "terser justin.min.js -o justin.min.js --module -c passes=3 -m",
25
25
  "test": "node test"
26
26
  },
@@ -54,7 +54,7 @@
54
54
  },
55
55
  "homepage": "https://github.com/spectjs/subscript#readme",
56
56
  "devDependencies": {
57
- "esbuild": "^0.13.14",
57
+ "rollup": "^2.60.2",
58
58
  "terser": "^5.10.0"
59
59
  }
60
60
  }
package/parse.js CHANGED
@@ -24,7 +24,8 @@ expr = (prec=0, end, cc, node, i=0, map, newNode) => {
24
24
  (cc=parse.space()) && (newNode = lookup[cc]?.(node, prec) || (!node && token(cc)) )
25
25
  ) node = newNode;
26
26
 
27
- if (end && cc !== end) err('Unclosed paren')
27
+ // skip end character, if expected
28
+ if (end) cc != end ? err('Unclosed paren') : idx++
28
29
 
29
30
  return node
30
31
  },
@@ -49,7 +50,7 @@ operator = parse.operator = (
49
50
  spaced=type<=0&&op.toUpperCase()!==op // non-postfix word operator must have space after
50
51
  ) => (
51
52
  map = !type ? node => { // binary, consume same-op group
52
- node = [op, node || err()]
53
+ node = [op, val(node)]
53
54
  do { idx+=l, node.push(val(expr(prec))) }
54
55
  while (parse.space()==c && (l<2||char(l)==op) && (!spaced||code(l)<=SPACE))
55
56
  return node
package/subscript.js CHANGED
@@ -1,4 +1,4 @@
1
- import parse, {skip, expr, code, tokens, val, operator as parseOp} from './parse.js'
1
+ import parse, {skip, expr, code, tokens, val, operator as parseOp, err} from './parse.js'
2
2
  import evaluate, {operator as evalOp} from './evaluate.js'
3
3
 
4
4
  const PERIOD=46, OPAREN=40, CPAREN=41, CBRACK=93, SPACE=32,
@@ -76,15 +76,15 @@ addOps(parseOp, 3, [
76
76
  '.', PREC_CALL, (node,b) => node && [skip(),node, typeof (b = expr(PREC_CALL)) === 'string' ? '"' + b + '"' : b.valueOf()],
77
77
 
78
78
  // a[b]
79
- '[', PREC_CALL, (node) => (skip(), node = ['.', node, val(expr(0,CBRACK))], skip(), node),
79
+ '[', PREC_CALL, (node) => (skip(), node = ['.', node, val(expr(0,CBRACK))], node),
80
80
  ']',,,
81
81
 
82
82
  // a(b)
83
- '(', PREC_CALL, (node,b) => ( skip(), b=expr(0,CPAREN), skip(),
83
+ '(', PREC_CALL, (node,b) => ( skip(), b=expr(0,CPAREN),
84
84
  Array.isArray(b) && b[0]===',' ? (b[0]=node, b) : b ? [node, val(b)] : [node]
85
85
  ),
86
86
  // (a+b)
87
- '(', PREC_GROUP, (node,b) => !node && (skip(), b=expr(0,CPAREN) || err(), skip(), b),
87
+ '(', PREC_GROUP, (node,b) => !node && (skip(), b=expr(0,CPAREN) || err(), b),
88
88
  ')',,,
89
89
  ])
90
90
 
@@ -101,8 +101,8 @@ addOps(evalOp, 2, [
101
101
  '/', (a,b)=>a/b,
102
102
  '*', (a,b)=>a*b,
103
103
 
104
- '+', (a,b)=>a+b,
105
- '-', (...a)=>a.length < 2 ? -a : a.reduce((a,b)=>a-b),
104
+ '+', (a,b=0)=>a+b,
105
+ '-', (a,b)=>b==null ? -a : a-b,
106
106
 
107
107
  '>>>', (a,b)=>a>>>b,
108
108
  '>>', (a,b)=>a>>b,
package/subscript.min.js CHANGED
@@ -1 +1 @@
1
- var r,e,t=(t,o)=>(e=t,r=0,o=l(),r<e.length?a():y(o)),a=(t="Bad syntax")=>{throw Error(t+" `"+e[r]+"` at "+r)},o=(t=1,a=r)=>{if("number"==typeof t)r+=t;else for(;t(n());)r++;return e.slice(a,r)},n=(t=0)=>e.charCodeAt(r+t),s=(t=1)=>e.substr(r,t),l=(r=0,e,o,n,s=0,l,p)=>{for(;(o=t.space())&&(p=u[o]?.(n,r)||!n&&f(o));)n=p;return e&&o!==e&&a("Unclosed paren"),n},p=(t.space=e=>{for(;(e=n())<=32;)r++;return e},t.token=[]),f=(r,e=0,t)=>{for(;e<p.length;)if(t=p[e++](r))return t},u=[],i=t.operator=(e,p=0,f=0,i,c=e.charCodeAt(0),h=e.length,g=u[c],d=f<=0&&e.toUpperCase()!==e)=>(i=f?f>0?r=>r&&[o(h),y(r)]:f<0?r=>!r&&[o(h),y(l(p-1))]:f:o=>{o=[e,o||a()];do{r+=h,o.push(y(l(p)))}while(t.space()==c&&(h<2||s(h)==e)&&(!d||n(h)<=32));return o},u[c]=(r,t)=>t<p&&(h<2||s(h)==e)&&(!d||n(h)<=32)&&i(r)||g&&g(r,t)),y=r=>Array.isArray(r)?r:(r||a()).valueOf(),c=t,h=r=>Array.isArray(r)&&("string"==typeof r[0]||h(r[0])),g=(r,e={},t,a)=>h(r)?("string"==typeof(t=r[0])&&(a=d[t]),"function"!=typeof(t=a||g(t,e))?t:t.call(...r.map((r=>g(r,e))))):r&&"string"==typeof r?'"'===r[0]?r.slice(1,-1):"@"===r[0]?r.slice(1):r in e?e[r]:r:r,d={},A=g.operator=(r,e)=>d[r]=2==e.length?(...r)=>r.reduce(e):e,v=g;p.push((r=>(r=o((r=>r>47&&r<58||46==r)))&&((69==n()||101==n())&&(r+=o(2)+o((r=>r>=48&&r<=57))),isNaN(r=new Number(r))?err("Bad number"):r)),((r,e)=>34==r&&o()+o((e=>e-r))+o()),(r=>o((r=>r>=48&&r<=57||r>=65&&r<=90||r>=97&&r<=122||36==r||95==r||r>=192))));var m=(r,e=2,t)=>{for(let a=0;a<t.length;a+=e)r(t[a],t[a+1],t[a+2])};m(i,3,[",",1,,"|",6,,"||",4,,"&",8,,"&&",5,,"^",7,,"==",9,,"!=",9,,">",10,,">=",10,,">>",11,,">>>",11,,"<",10,,"<=",10,,"<<",11,,"+",12,,"+",15,-1,"++",15,-1,"++",16,1,"-",12,,"-",15,-1,"--",15,-1,"--",16,1,"!",15,-1,"*",13,,"/",13,,"%",13,,".",18,(r,e)=>r&&[o(),r,"string"==typeof(e=l(18))?'"'+e+'"':e.valueOf()],"[",18,r=>(o(),r=[".",r,y(l(0,93))],o(),r),"]",,,"(",18,(r,e)=>(o(),e=l(0,41),o(),Array.isArray(e)&&","===e[0]?(e[0]=r,e):e?[r,y(e)]:[r]),"(",19,(r,e)=>!r&&(o(),e=l(0,41)||err(),o(),e),")",,,]),m(A,2,["!",r=>!r,"++",r=>++r,"--",r=>--r,".",(r,e)=>r&&r[e],"%",(r,e)=>r%e,"/",(r,e)=>r/e,"*",(r,e)=>r*e,"+",(r,e)=>r+e,"-",(...r)=>r.length<2?-r:r.reduce(((r,e)=>r-e)),">>>",(r,e)=>r>>>e,">>",(r,e)=>r>>e,"<<",(r,e)=>r<<e,">=",(r,e)=>r>=e,">",(r,e)=>r>e,"<=",(r,e)=>r<=e,"<",(r,e)=>r<e,"!=",(r,e)=>r!=e,"==",(r,e)=>r==e,"&",(r,e)=>r&e,"^",(r,e)=>r^e,"|",(r,e)=>r|e,"&&",(...r)=>r.every(Boolean),"||",(...r)=>r.some(Boolean),",",(r,e)=>e]);var b=r=>(r="string"==typeof r?c(r):r,e=>v(r,e));export{b as default,v as evaluate,c as parse};
1
+ let r,e;const t=(t,o)=>(e=t,r=0,o=l(),r<e.length?n():h(o)),n=(t="Bad syntax")=>{throw Error(t+" `"+e[r]+"` at "+r)},o=(t=1,n=r)=>{if("number"==typeof t)r+=t;else for(;t(a());)r++;return e.slice(n,r)},a=(t=0)=>e.charCodeAt(r+t),s=(t=1)=>e.substr(r,t),l=(e=0,o,a,s,l=0,u,i)=>{for(;(a=t.space())&&(i=f[a]?.(s,e)||!s&&p(a));)s=i;return o&&(a!=o?n("Unclosed paren"):r++),s};t.space=e=>{for(;(e=a())<=32;)r++;return e};const u=t.token=[],p=(r,e=0,t)=>{for(;e<u.length;)if(t=u[e++](r))return t},f=[],i=t.operator=(e,n=0,u=0,p,i=e.charCodeAt(0),y=e.length,c=f[i],g=u<=0&&e.toUpperCase()!==e)=>(p=u?u>0?r=>r&&[o(y),h(r)]:u<0?r=>!r&&[o(y),h(l(n-1))]:u:o=>{o=[e,h(o)];do{r+=y,o.push(h(l(n)))}while(t.space()==i&&(y<2||s(y)==e)&&(!g||a(y)<=32));return o},f[i]=(r,t)=>t<n&&(y<2||s(y)==e)&&(!g||a(y)<=32)&&p(r)||c&&c(r,t)),h=r=>Array.isArray(r)?r:(r||n()).valueOf(),y=(r,e={})=>{if("string"==typeof r)return'"'===r[0]?r.slice(1,-1):"@"===r[0]?r.slice(1):r in e?e[r]:r;if(Array.isArray(r)){let t=r[0],n=Array.isArray(t)?y(t,e):c[t]||e[t]||t,o=[],a=1;for(;a<r.length;a++)o.push(y(r[a],e));return o.length>n.length&&n.length?o.reduce(n):n.apply(t,o)}return r},c={},g=y.operator=(r,e)=>c[r]=e;u.push((r=>(r=o((r=>r>47&&r<58||46==r)))&&((69==a()||101==a())&&(r+=o(2)+o((r=>r>=48&&r<=57))),isNaN(r=new Number(r))?n("Bad number"):r)),((r,e)=>34==r&&o()+o((e=>e-r))+o()),(r=>o((r=>r>=48&&r<=57||r>=65&&r<=90||r>=97&&r<=122||36==r||95==r||r>=192))));const A=(r,e=2,t)=>{for(let n=0;n<t.length;n+=e)r(t[n],t[n+1],t[n+2])};A(i,3,[",",1,,"|",6,,"||",4,,"&",8,,"&&",5,,"^",7,,"==",9,,"!=",9,,">",10,,">=",10,,">>",11,,">>>",11,,"<",10,,"<=",10,,"<<",11,,"+",12,,"+",15,-1,"++",15,-1,"++",16,1,"-",12,,"-",15,-1,"--",15,-1,"--",16,1,"!",15,-1,"*",13,,"/",13,,"%",13,,".",18,(r,e)=>r&&[o(),r,"string"==typeof(e=l(18))?'"'+e+'"':e.valueOf()],"[",18,r=>(o(),[".",r,h(l(0,93))]),"]",,,"(",18,(r,e)=>(o(),e=l(0,41),Array.isArray(e)&&","===e[0]?(e[0]=r,e):e?[r,h(e)]:[r]),"(",19,(r,e)=>!r&&(o(),l(0,41)||n()),")",,,]),A(g,2,["!",r=>!r,"++",r=>++r,"--",r=>--r,".",(r,e)=>r?r[e]:r,"%",(r,e)=>r%e,"/",(r,e)=>r/e,"*",(r,e)=>r*e,"+",(r,e=0)=>r+e,"-",(r,e)=>null==e?-r:r-e,">>>",(r,e)=>r>>>e,">>",(r,e)=>r>>e,"<<",(r,e)=>r<<e,">=",(r,e)=>r>=e,">",(r,e)=>r>e,"<=",(r,e)=>r<=e,"<",(r,e)=>r<e,"!=",(r,e)=>r!=e,"==",(r,e)=>r==e,"&",(r,e)=>r&e,"^",(r,e)=>r^e,"|",(r,e)=>r|e,"&&",(...r)=>r.every(Boolean),"||",(...r)=>r.some(Boolean),",",(r,e)=>e]);var d=r=>(r="string"==typeof r?t(r):r,e=>y(r,e));export{d as default,y as evaluate,t as parse};