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 +2 -4
- package/justin.js +4 -3
- package/justin.min.js +1 -1
- package/package.json +1 -1
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
|
|
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
|
|
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])),
|
|
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};
|