subscript 7.5.5 → 7.6.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
@@ -67,19 +67,17 @@ _Justin_ is minimal JS subset − JSON with JS expressions (see original [thread
67
67
 
68
68
  It extends _subscript_ with:
69
69
 
70
- + `===`, `!==` operators
71
70
  + `**` exponentiation operator (right-assoc)
72
71
  + `~` bit inversion operator
73
72
  + `'` strings
74
73
  + `?:` ternary operator
75
74
  + `?.` optional chain operator
76
- + `??` nullish coalesce operator
77
75
  + `[...]` Array literal
78
76
  + `{...}` Object literal
79
77
  + `in` binary
80
78
  + `;` expression separator
81
79
  + `//`, `/* */` comments
82
- + `true`, `false`, `null`, `undefined` literals
80
+ + `true`, `false`, `null` literals
83
81
  <!-- + `...x` unary operator -->
84
82
  <!-- + strings interpolation -->
85
83
 
@@ -128,7 +126,7 @@ AST has simplified lispy tree structure (inspired by [frisk](https://ghub.io/fri
128
126
 
129
127
  * not limited to particular language (JS), can be compiled to different targets;
130
128
  * reflects execution sequence, rather than code layout;
131
- * has minimal possible overhead (object wrappers, named properties), directly maps to operators;
129
+ * has minimal overhead, directly maps to operators;
132
130
  * simplifies manual evaluation and debugging;
133
131
  * has conventional form and one-line docs:
134
132
 
package/justin.js CHANGED
@@ -20,8 +20,8 @@ let escape = { n: '\n', r: '\r', t: '\t', b: '\b', f: '\f', v: '\v' },
20
20
  }
21
21
 
22
22
  // operators
23
- set('===', PREC_EQ, (a, b) => a === b)
24
- set('!==', PREC_EQ, (a, b) => a !== b)
23
+ // set('===', PREC_EQ, (a, b) => a === b)
24
+ // set('!==', PREC_EQ, (a, b) => a !== b)
25
25
  set('~', PREC_UNARY, (a) => ~a)
26
26
 
27
27
  // ?:
@@ -68,7 +68,8 @@ token('//', 20, (a, prec) => (skip(c => c >= 32), a || expr(prec) || ['']))
68
68
  token('null', 20, a => a ? err() : ['', null])
69
69
  token('true', 20, a => a ? err() : ['', true])
70
70
  token('false', 20, a => a ? err() : ['', false])
71
- token('undefined', 20, a => a ? err() : ['', undefined])
71
+ // token('undefined', 20, a => a ? err() : ['', undefined])
72
+ // token('NaN', 20, a => a ? err() : ['', NaN])
72
73
 
73
74
  // FIXME: make sure that is right
74
75
  set(';', -20, (...args) => { for (let i = args.length; i--;) if (args[i] != null) return args[i] })
package/justin.min.js CHANGED
@@ -1 +1 @@
1
- let e,t,r=r=>(e=0,t=r,r=a(),t[e]?l():r||""),l=(r="Bad syntax",l=t[e],n=t.slice(0,e).split("\n"),a=n.pop())=>{let s=t.slice(e-108,e).split("\n").pop(),i=t.slice(e+1,e+108).split("\n").shift();throw EvalError(`${r} at ${n.length}:${a.length} \`${s+l+i}\``,"font-weight: bold")},n=(r=1,l=e,n)=>{if("number"==typeof r)e+=r;else for(;n=r(t.charCodeAt(e));)e+=n;return t.slice(l,e)},a=(t=0,n,a,s,i,o)=>{for(;(a=r.space())&&(i=((o=p[a])&&o(s,t))??(!s&&r.id()));)s=i;return n&&(a==n?e++:l()),s},s=e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>=192&&215!=e&&247!=e,i=r.space=r=>{for(;(r=t.charCodeAt(e))<=32;)e++;return r},o=r.id=e=>n(s),p=[],h=(r,l=32,n,a=r.charCodeAt(0),i=r.length,o=p[a],h=r.toUpperCase()!==r)=>p[a]=(a,p,c=e)=>p<l&&(i<2||t.substr(e,i)==r)&&(!h||!s(t.charCodeAt(e+i)))&&(e+=i,n(a,p))||(e=c,o?.(a,p)),c=(e,t,r=0)=>h(e,t,((l,n)=>l&&(n=a(t-r/2))&&[e,l,n])),f=(e,t,r)=>h(e,t,(l=>r?l&&[e,l]:!l&&(l=a(t-.5))&&[e,l])),d=(e,t,r)=>{h(e,t,((l,n)=>(l||r)&&((n=a(t))||r)&&((!l||l[0]!==e)&&(l=[e,l]),(n||r)&&l.push(n),l)))};const u=e=>Array.isArray(e)?g[e[0]](...e.slice(1)):t=>t?.[e],g={},m=(e,t,r=g[e])=>g[e]=(...e)=>t(...e)||r&&r(...e),A=e=>(e=r(e),t=>(e.call?e:e=u(e))(t)),b=(e,t,r)=>r.length?r.length>1?(c(e,Math.abs(t),t<0),m(e,((e,t)=>t&&(e=u(e),t=u(t),e.length||t.length?l=>r(e(l),t(l)):(e=r(e(),t()),()=>e))))):(f(e,t),m(e,((e,t)=>!t&&((e=u(e)).length?t=>r(e(t)):(e=r(e()),()=>e))))):(d(e,Math.abs(t),t<0),m(e,((...e)=>(e=e.map(u),t=>r(...e.map((e=>e(t)))))))),y=e=>e?l():["",(e=+n((e=>46===e||e>=48&&e<=57||(69===e||101===e?2:0))))!=e?l():e],C=(e,t,r,l)=>(h(e,t,(r=>r?["++"===e?"-":"+",[e,r],["",1]]:[e,a(t-1)])),m(e,l=(e,t)=>"("===e[0]?l(e[1]):"."===e[0]?(t=e[2],e=u(e[1]),l=>r(e(l),t)):"["===e[0]?([,e,t]=e,e=u(e),t=u(t),l=>r(e(l),t(l))):t=>r(t,e)));m("",(e=>()=>e)),p[34]=e=>e?l():["",(n()+n((e=>e-34?1:0))+(n()||l("Bad string"))).slice(1,-1)],p[46]=e=>!e&&y();for(let e=0;e<=9;e++)p[48+e]=y;b(",",1,((...e)=>e[e.length-1])),b("||",4,((...e)=>{let t,r=0;for(;!t&&r<e.length;)t=e[r++];return t})),b("&&",5,((...e)=>{let t=0,r=!0;for(;r&&t<e.length;)r=e[t++];return r})),c("=",10,!0),m("=",((e,t)=>{let r,n,a=u(t),s="string"==typeof e?(t,r)=>t[e]=r:"."===e[0]?(r=u(e[1]),n=e[2],(e,t)=>r(e)[n]=t):"["===e[0]?(r=u(e[1]),n=u(e[2]),(e,t)=>r(e)[n(e)]=t):l("Bad LHS");return e=>s(e,a(e))})),b("+",12,((e,t)=>e+t)),b("-",12,((e,t)=>e-t)),b("*",13,((e,t)=>e*t)),b("/",13,((e,t)=>e/t)),b("%",13,((e,t)=>e%t)),b("|",6,((e,t)=>e|t)),b("&",8,((e,t)=>e&t)),b("^",7,((e,t)=>e^t)),b("==",9,((e,t)=>e==t)),b("!=",9,((e,t)=>e!=t)),b(">",10,((e,t)=>e>t)),b(">=",10,((e,t)=>e>=t)),b("<",10,((e,t)=>e<t)),b("<=",10,((e,t)=>e<=t)),b(">>",11,((e,t)=>e>>t)),b(">>>",11,((e,t)=>e>>>t)),b("<<",11,((e,t)=>e<<t)),b("+",15,(e=>+e)),b("-",15,(e=>-e)),b("!",15,(e=>!e)),C("++",15,((e,t)=>++e[t])),C("--",15,((e,t)=>--e[t])),h("[",18,(e=>e&&["[",e,a(0,93)||l()])),m("[",((e,t)=>t&&(e=u(e),t=u(t),r=>e(r)[t(r)]))),h(".",18,((e,t)=>e&&(t=a(18))&&[".",e,t])),m(".",((e,t)=>(e=u(e),t=t[0]?t:t[1],r=>e(r)[t]))),h("(",18,(e=>!e&&["(",a(0,41)||l()])),h("(",18,((e,t)=>e&&((t=a(0,41))?["(",e,t]:["(",e,""]))),m("(",((e,t,r,l,n)=>null==t?u(e):(n=""==t?()=>[]:","===t[0]?(t=t.slice(1).map(u),e=>t.map((t=>t(e)))):(t=u(t),e=>[t(e)]),"."===e[0]?(r=e[2],e=u(e[1]),t=>e(t)[r](...n(t))):"["===e[0]?(r=u(e[2]),e=u(e[1]),t=>e(t)[r(t)](...n(t))):(e=u(e),t=>e(t)(...n(t))))));let v={n:"\n",r:"\r",t:"\t",b:"\b",f:"\f",v:"\v"},B=r=>(a,s,i="")=>{for(a&&l("Unexpected string"),n();(s=t.charCodeAt(e))-r;)92===s?(n(),s=n(),i+=v[s]||s):i+=n();return n()||l("Bad string"),["",i]};b("===",9,((e,t)=>e===t)),b("!==",9,((e,t)=>e!==t)),b("~",15,(e=>~e)),h("?",3,((e,t,r)=>e&&(t=a(2,58))&&["?",e,t,a(3)])),m("?",((e,t,r)=>(e=u(e),t=u(t),r=u(r),l=>e(l)?t(l):r(l)))),b("??",6,((e,t)=>e??t)),h("?.",18,(e=>e&&["?.",e])),m("?.",(e=>(e=u(e),t=>e(t)||(()=>{})))),h("?.",18,((e,t)=>e&&!(t=a(18))?.map&&["?.",e,t])),m("?.",((e,t)=>t&&(e=u(e),r=>e(r)?.[t]))),m("(",((e,t,r,l,n,a)=>null!=t&&"?."===e[0]&&(e[2]||Array.isArray(e[1]))&&(l=""==t?()=>[]:","===t[0]?(t=t.slice(1).map(u),e=>t.map((t=>t(e)))):(t=u(t),e=>[t(e)]),!e[2]&&(e=e[1]),n="["===e[0]?u(e[2]):t=>e[2],r=u(e[1]),e=>r(e)?.[n(e)]?.(...l(e))))),b("in",10,((e,t)=>e in t)),p[34]=B(34),p[39]=B(39),h("/*",20,((r,l)=>(n((r=>42!==r&&47!==t.charCodeAt(e+1))),n(2),r||a(l)||[""]))),h("//",20,((e,t)=>(n((e=>e>=32)),e||a(t)||[""]))),h("null",20,(e=>e?l():["",null])),h("true",20,(e=>e?l():["",!0])),h("false",20,(e=>e?l():["",!1])),h("undefined",20,(e=>e?l():["",void 0])),b(";",-20,((...e)=>{for(let t=e.length;t--;)if(null!=e[t])return e[t]})),b("**",-14,((e,t)=>e**t)),h("[",20,(e=>!e&&["[",a(0,93)||""])),m("[",((e,t)=>!t&&(e?","===e[0]?(e=e.slice(1).map(u),t=>e.map((e=>e(t)))):(e=u(e),t=>[e(t)]):()=>[]))),h("{",20,(e=>!e&&["{",a(0,125)||""])),m("{",((e,t)=>e?","===e[0]?(e=e.slice(1).map(u),t=>Object.fromEntries(e.map((e=>e(t))))):":"===e[0]?(e=u(e),t=>Object.fromEntries([e(t)])):(t=u(e),r=>({[e]:t(r)})):e=>({}))),h(":",1.1,((e,t)=>[":",e,a(1.1)||l()])),m(":",((e,t)=>(t=u(t),e=Array.isArray(e)?u(e):(e=>e).bind(0,e),r=>[e(r),t(r)])));export{c as binary,u as compile,t as cur,A as default,l as err,a as expr,o as id,e as idx,s as isId,p as lookup,d as nary,m as operator,g as operators,r as parse,b as set,n as skip,i as space,h as token,f as unary};
1
+ let e,t,r=r=>(e=0,t=r,r=a(),t[e]?l():r||""),l=(r="Bad syntax",l=t[e],n=t.slice(0,e).split("\n"),a=n.pop())=>{let s=t.slice(e-108,e).split("\n").pop(),i=t.slice(e+1,e+108).split("\n").shift();throw EvalError(`${r} at ${n.length}:${a.length} \`${s+l+i}\``,"font-weight: bold")},n=(r=1,l=e,n)=>{if("number"==typeof r)e+=r;else for(;n=r(t.charCodeAt(e));)e+=n;return t.slice(l,e)},a=(t=0,n,a,s,i,o)=>{for(;(a=r.space())&&(i=((o=p[a])&&o(s,t))??(!s&&r.id()));)s=i;return n&&(a==n?e++:l()),s},s=e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>=192&&215!=e&&247!=e,i=r.space=r=>{for(;(r=t.charCodeAt(e))<=32;)e++;return r},o=r.id=e=>n(s),p=[],h=(r,l=32,n,a=r.charCodeAt(0),i=r.length,o=p[a],h=r.toUpperCase()!==r)=>p[a]=(a,p,c=e)=>p<l&&(i<2||t.substr(e,i)==r)&&(!h||!s(t.charCodeAt(e+i)))&&(e+=i,n(a,p))||(e=c,o?.(a,p)),c=(e,t,r=0)=>h(e,t,((l,n)=>l&&(n=a(t-r/2))&&[e,l,n])),f=(e,t,r)=>h(e,t,(l=>r?l&&[e,l]:!l&&(l=a(t-.5))&&[e,l])),u=(e,t,r)=>{h(e,t,((l,n)=>(l||r)&&((n=a(t))||r)&&((!l||l[0]!==e)&&(l=[e,l]),(n||r)&&l.push(n),l)))};const g=e=>Array.isArray(e)?d[e[0]](...e.slice(1)):t=>t?.[e],d={},m=(e,t,r=d[e])=>d[e]=(...e)=>t(...e)||r&&r(...e),A=e=>(e=r(e),t=>(e.call?e:e=g(e))(t)),b=(e,t,r)=>r.length?r.length>1?(c(e,Math.abs(t),t<0),m(e,((e,t)=>t&&(e=g(e),t=g(t),e.length||t.length?l=>r(e(l),t(l)):(e=r(e(),t()),()=>e))))):(f(e,t),m(e,((e,t)=>!t&&((e=g(e)).length?t=>r(e(t)):(e=r(e()),()=>e))))):(u(e,Math.abs(t),t<0),m(e,((...e)=>(e=e.map(g),t=>r(...e.map((e=>e(t)))))))),y=e=>e?l():["",(e=+n((e=>46===e||e>=48&&e<=57||(69===e||101===e?2:0))))!=e?l():e],C=(e,t,r,l)=>(h(e,t,(r=>r?["++"===e?"-":"+",[e,r],["",1]]:[e,a(t-1)])),m(e,l=(e,t)=>"("===e[0]?l(e[1]):"."===e[0]?(t=e[2],e=g(e[1]),l=>r(e(l),t)):"["===e[0]?([,e,t]=e,e=g(e),t=g(t),l=>r(e(l),t(l))):t=>r(t,e)));m("",(e=>()=>e)),p[34]=e=>e?l():["",(n()+n((e=>e-34?1:0))+(n()||l("Bad string"))).slice(1,-1)],p[46]=e=>!e&&y();for(let e=0;e<=9;e++)p[48+e]=y;b(",",1,((...e)=>e[e.length-1])),b("||",4,((...e)=>{let t,r=0;for(;!t&&r<e.length;)t=e[r++];return t})),b("&&",5,((...e)=>{let t=0,r=!0;for(;r&&t<e.length;)r=e[t++];return r})),c("=",10,!0),m("=",((e,t)=>{let r,n,a=g(t),s="string"==typeof e?(t,r)=>t[e]=r:"."===e[0]?(r=g(e[1]),n=e[2],(e,t)=>r(e)[n]=t):"["===e[0]?(r=g(e[1]),n=g(e[2]),(e,t)=>r(e)[n(e)]=t):l("Bad LHS");return e=>s(e,a(e))})),b("+",12,((e,t)=>e+t)),b("-",12,((e,t)=>e-t)),b("*",13,((e,t)=>e*t)),b("/",13,((e,t)=>e/t)),b("%",13,((e,t)=>e%t)),b("|",6,((e,t)=>e|t)),b("&",8,((e,t)=>e&t)),b("^",7,((e,t)=>e^t)),b("==",9,((e,t)=>e==t)),b("!=",9,((e,t)=>e!=t)),b(">",10,((e,t)=>e>t)),b(">=",10,((e,t)=>e>=t)),b("<",10,((e,t)=>e<t)),b("<=",10,((e,t)=>e<=t)),b(">>",11,((e,t)=>e>>t)),b(">>>",11,((e,t)=>e>>>t)),b("<<",11,((e,t)=>e<<t)),b("+",15,(e=>+e)),b("-",15,(e=>-e)),b("!",15,(e=>!e)),C("++",15,((e,t)=>++e[t])),C("--",15,((e,t)=>--e[t])),h("[",18,(e=>e&&["[",e,a(0,93)||l()])),m("[",((e,t)=>t&&(e=g(e),t=g(t),r=>e(r)[t(r)]))),h(".",18,((e,t)=>e&&(t=a(18))&&[".",e,t])),m(".",((e,t)=>(e=g(e),t=t[0]?t:t[1],r=>e(r)[t]))),h("(",18,(e=>!e&&["(",a(0,41)||l()])),h("(",18,((e,t)=>e&&((t=a(0,41))?["(",e,t]:["(",e,""]))),m("(",((e,t,r,l,n)=>null==t?g(e):(n=""==t?()=>[]:","===t[0]?(t=t.slice(1).map(g),e=>t.map((t=>t(e)))):(t=g(t),e=>[t(e)]),"."===e[0]?(r=e[2],e=g(e[1]),t=>e(t)[r](...n(t))):"["===e[0]?(r=g(e[2]),e=g(e[1]),t=>e(t)[r(t)](...n(t))):(e=g(e),t=>e(t)(...n(t))))));let B={n:"\n",r:"\r",t:"\t",b:"\b",f:"\f",v:"\v"},E=r=>(a,s,i="")=>{for(a&&l("Unexpected string"),n();(s=t.charCodeAt(e))-r;)92===s?(n(),s=n(),i+=B[s]||s):i+=n();return n()||l("Bad string"),["",i]};b("~",15,(e=>~e)),h("?",3,((e,t,r)=>e&&(t=a(2,58))&&["?",e,t,a(3)])),m("?",((e,t,r)=>(e=g(e),t=g(t),r=g(r),l=>e(l)?t(l):r(l)))),b("??",6,((e,t)=>e??t)),h("?.",18,(e=>e&&["?.",e])),m("?.",(e=>(e=g(e),t=>e(t)||(()=>{})))),h("?.",18,((e,t)=>e&&!(t=a(18))?.map&&["?.",e,t])),m("?.",((e,t)=>t&&(e=g(e),r=>e(r)?.[t]))),m("(",((e,t,r,l,n,a)=>null!=t&&"?."===e[0]&&(e[2]||Array.isArray(e[1]))&&(l=""==t?()=>[]:","===t[0]?(t=t.slice(1).map(g),e=>t.map((t=>t(e)))):(t=g(t),e=>[t(e)]),!e[2]&&(e=e[1]),n="["===e[0]?g(e[2]):t=>e[2],r=g(e[1]),e=>r(e)?.[n(e)]?.(...l(e))))),b("in",10,((e,t)=>e in t)),p[34]=E(34),p[39]=E(39),h("/*",20,((r,l)=>(n((r=>42!==r&&47!==t.charCodeAt(e+1))),n(2),r||a(l)||[""]))),h("//",20,((e,t)=>(n((e=>e>=32)),e||a(t)||[""]))),h("null",20,(e=>e?l():["",null])),h("true",20,(e=>e?l():["",!0])),h("false",20,(e=>e?l():["",!1])),b(";",-20,((...e)=>{for(let t=e.length;t--;)if(null!=e[t])return e[t]})),b("**",-14,((e,t)=>e**t)),h("[",20,(e=>!e&&["[",a(0,93)||""])),m("[",((e,t)=>!t&&(e?","===e[0]?(e=e.slice(1).map(g),t=>e.map((e=>e(t)))):(e=g(e),t=>[e(t)]):()=>[]))),h("{",20,(e=>!e&&["{",a(0,125)||""])),m("{",((e,t)=>e?","===e[0]?(e=e.slice(1).map(g),t=>Object.fromEntries(e.map((e=>e(t))))):":"===e[0]?(e=g(e),t=>Object.fromEntries([e(t)])):(t=g(e),r=>({[e]:t(r)})):e=>({}))),h(":",1.1,((e,t)=>[":",e,a(1.1)||l()])),m(":",((e,t)=>(t=g(t),e=Array.isArray(e)?g(e):(e=>e).bind(0,e),r=>[e(r),t(r)])));export{c as binary,g as compile,t as cur,A as default,l as err,a as expr,o as id,e as idx,s as isId,p as lookup,u as nary,m as operator,d as operators,r as parse,b as set,n as skip,i as space,h as token,f as unary};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "subscript",
3
- "version": "7.5.5",
3
+ "version": "7.6.0",
4
4
  "description": "Fast and tiny expression evaluator with minimal syntax.",
5
5
  "main": "subscript.js",
6
6
  "module": "subscript.js",