From e1ce7b201e662757b62c480c8ae1c76e41ad8a5f Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sun, 2 Aug 2020 17:08:51 -0400 Subject: Add self-hosted Javascript script --- bqn.js | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/c.bqn | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/cjs.bqn | 15 +++++++ src/pr.bqn | 47 ++++++++++++++++++++++ test/tj.js | 27 +++++++++++++ 5 files changed, 350 insertions(+) create mode 100644 bqn.js create mode 100644 src/c.bqn create mode 100755 src/cjs.bqn create mode 100755 src/pr.bqn create mode 100755 test/tj.js diff --git a/bqn.js b/bqn.js new file mode 100644 index 00000000..1ce3aea4 --- /dev/null +++ b/bqn.js @@ -0,0 +1,129 @@ +// Virtual machine +let assert = x => { if (!x) throw Error(); } +let has = x => x!==undefined; +let call = (f,x,w) => { + let ff = f; + if (typeof f === "function") { + assert(!f.m1&&!f.m2); + } else { + ff = ()=>f; + } + return !has(x) ? x : ff(x,w); +} +let get1= i => (v=>(assert(v!==null),v))(i[0][i[1]]); +let get = i => i.a ? arr(i.map(get),i.sh) : get1(i); +let set = (d,id,v) => { + let eq = (a,b) => a.length===b.length && a.every((e,i)=>e===b[i]); + if (id.a) { + assert(v.a&&eq(id.sh,v.sh)); id.map((n,j)=>set(d,n,v[j])); + } else { + let [a,i]=id; assert((a[i]===null)==d); a[i]=v; + } + return v; +} +let run = (B,O,S) => { // Bytecode, Objects, Sections/blocks + // Turn each block into an environment=>pushable value map + let D = S.map(([t,i,st,l]) => e => { + let v=Array(l).fill(null); + let c = sv => vm(st,[sv.concat(v)].concat(e)); + return [ + n => n([]), + n => {let r=(f )=>n([r,f ]);r.m1=1;return r;}, + n => {let r=(f,g)=>n([r,f,g]);r.m2=1;return r;} + ][t]([ + v => {let r=(x,w)=>c([r,x,w].concat(v));return r;}, + c + ][i]); + }); + // Execute + let vm = (p,e) => { // Program counter, Environment + let s=[]; // Stack + let num = () => { + let b=128,n=B[p++]; + if (n=b); + return t+i*n; + } + while (1) switch(B[p++]) { + case 0: s.push(O[num()]);break; + case 3: case 4: {let a=s.splice(s.length-num());s.push(list(a));break;} + case 5: case 16:{let[x,f] =s.splice(-2);s.push(call(f,x ));break;} + case 6: case 17:{let[x,f,w]=s.splice(-3);s.push(call(f,x,w));break;} + case 7: {let[m,f] =s.splice(-2);assert(m.m1);s.push(m(f ));break;} + case 8: {let[g,m,f]=s.splice(-3);assert(m.m2);s.push(m(f,g));break;} + case 9: {let[h,g] =s.splice(-2);s.push((x,w)=>call(g,call(h,x,w)));break;} + case 10:case 19:{let[h,g,f]=s.splice(-3);s.push((x,w)=>call(g,call(h,x,w),has(f)?call(f,x,w):f));break;} + case 11: {let[v, i]=s.splice(-2);s.push(set(1,i,v));break;} + case 12: {let[v, i]=s.splice(-2);s.push(set(0,i,v));break;} + case 13: {let[x,f,i]=s.splice(-3);s.push(set(0,i,call(f,x,get(i))));break;} + case 14:{s.pop();break;} + case 15:{s.push(D[num()](e));break;} + case 21:{let v=e[num()][num()];assert(v!==null);s.push(v);break;} + case 22:{s.push([e[num()],num()]);break;} + case 25:assert(s.length===1);return s[0]; + } + } + try { + return D[0]([]); + } catch (err) { + return "error" + } +} + +// Runtime +let arr = (r,sh) => {r.sh=sh;r.a=1;return r;} +let list = l => arr(l,[l.length]); +let str = s => list(Array.from(s)); +let m1 = m => {m.m1=1;return m;} +let m2 = m => {m.m2=1;return m;} +let lesseq = (x,w) => { + let s=typeof w, t=typeof x; + return +(s!==t ? s<=t : w<=x); +} +let table = m1(f => (x,w) => !has(w) + ? arr(x.map(e=>call(f,e)),x.sh) + : arr([].concat.apply([],w.map(d=>x.map(e=>call(f,e,d)))),w.sh.concat(x.sh))); +let scan = m1(f => (x,w) => { + let s=x.sh;assert(!has(w)&&x.a&&s.length>0); + let c=1;for(let i=1;i +(x.a===1) // IsArray + ,(x,w) => 0 // Type + ,(x,w) => has(w)?Math.log(x)/Math.log(w):Math.log(x) // Log + ,(x,w) => assert(x===1) // ! + ,(x,w) => has(w)?w+x:x // + + ,(x,w) => (has(w)?w:0)-x // - + ,(x,w) => w*x // × + ,(x,w) => (has(w)?w:1)/x // ÷ + ,(x,w) => has(w)?Math.pow(w,x):Math.exp(x) // ⋆ + ,(x,w) => Math.floor(x) // ⌊ + ,(x,w) => has(w)?+(x===w):x.a?x.sh.length:0 // = + ,lesseq // ≤ + ,(x,w) => list(x.sh) // ≢ + ,(x,w) => (r=>arr(r,has(w)?w:[r.length],1))(x.slice()) // ⥊ + ,(x,w) => x[w] // ⊑ + ,(x,w) => list(Array(x).fill(undefined).map((_,i)=>i)) // ↕ + ,table // ⌜ + ,scan // ` +])); + +// Compiler +let compile = run( + new Uint8Array([0,70,22,0,0,11,14,0,71,22,0,1,11,14,0,72,22,0,2,11,14,0,73,22,0,3,11,14,0,74,22,0,4,11,14,0,75,22,0,5,11,0,76,0,77,0,78,0,20,21,0,1,17,0,79,0,80,0,81,0,82,0,83,21,0,2,0,84,0,85,0,20,21,0,3,17,0,20,21,0,4,17,21,0,0,0,20,0,86,17,3,13,22,0,6,11,0,20,16,22,0,7,11,14,21,0,6,0,38,0,13,7,16,0,26,16,0,35,16,22,0,8,22,0,9,22,0,10,22,0,11,22,0,12,22,0,13,22,0,14,22,0,15,22,0,16,22,0,17,22,0,18,22,0,19,22,0,20,4,13,11,14,21,0,6,0,22,0,50,17,0,38,0,13,7,16,0,41,0,0,7,16,22,0,21,11,14,0,51,0,20,0,54,0,24,16,0,25,16,0,26,0,53,17,17,0,20,21,0,6,0,22,0,52,17,0,38,0,13,7,16,0,20,0,51,17,0,26,16,0,22,21,0,16,0,13,16,0,1,21,0,21,17,17,17,22,0,22,11,14,0,52,0,51,3,2,0,39,0,1,7,0,52,0,53,0,55,3,3,17,0,19,16,22,0,23,11,14,15,1,22,0,24,11,14,15,2,22,0,25,11,14,0,30,0,45,0,57,8,0,23,0,45,0,57,8,21,0,25,3,3,0,48,0,29,0,31,0,89,0,20,0,91,17,19,0,30,9,8,22,0,26,11,14,15,3,22,0,27,11,14,15,4,22,0,28,11,14,15,5,22,0,29,11,14,21,0,29,25,0,87,0,14,21,0,1,17,22,0,3,11,14,0,88,0,14,21,0,1,17,0,9,0,45,0,23,0,45,0,54,8,0,22,0,13,19,8,16,0,26,16,22,0,4,11,14,0,89,0,14,21,0,1,17,0,26,16,22,0,5,11,14,21,0,4,21,0,5,0,23,0,56,17,21,0,3,0,26,16,3,3,0,20,16,22,0,6,11,0,27,16,22,0,7,11,14,21,0,6,0,29,21,0,7,17,22,0,6,12,14,21,0,4,0,0,0,54,17,21,0,5,0,23,0,57,17,0,57,0,20,21,1,1,0,14,21,0,1,17,17,0,26,16,0,26,0,45,21,0,3,0,42,0,0,7,16,0,20,0,51,17,0,46,0,29,0,43,0,18,0,20,0,51,19,0,23,0,56,19,0,1,0,18,19,8,8,8,16,3,3,0,20,16,0,29,21,0,7,17,22,0,8,11,14,15,6,0,49,15,7,8,22,0,9,11,14,21,0,8,0,27,21,0,6,17,0,13,0,46,0,20,8,16,0,13,0,36,0,22,7,0,57,19,0,46,21,0,9,8,16,0,23,0,56,17,22,0,10,11,14,21,0,8,0,37,0,20,7,21,0,6,17,0,26,21,0,10,17,22,0,11,11,14,0,19,0,36,0,20,7,21,0,1,0,13,16,19,0,40,0,26,7,9,0,23,0,56,19,22,0,12,11,14,21,0,11,21,0,12,16,0,42,0,13,7,16,0,8,16,22,0,13,11,14,21,0,11,0,26,21,0,3,0,29,21,0,6,0,26,21,0,10,17,17,0,8,16,17,22,0,14,11,14,21,0,14,21,0,12,16,0,42,0,13,7,16,0,2,21,0,14,0,37,0,30,7,16,21,0,12,16,0,42,0,0,7,16,17,0,36,0,1,7,0,57,17,0,36,0,35,7,21,0,1,17,22,0,15,11,0,34,16,22,0,16,11,14,21,0,14,0,37,0,25,0,43,0,30,8,7,16,21,0,12,16,0,26,21,0,13,17,22,0,17,11,14,21,0,1,0,26,21,0,13,17,0,31,21,1,7,17,22,0,18,11,14,21,1,17,21,1,18,21,1,19,3,3,0,20,16,0,33,21,0,18,17,22,0,19,11,0,11,0,45,0,18,0,20,0,51,19,0,22,0,13,19,8,16,22,0,20,11,14,21,0,18,0,35,21,0,20,0,42,0,0,7,16,0,2,21,0,19,17,0,36,0,1,7,0,57,17,17,22,0,21,11,14,21,1,3,0,13,16,22,0,22,11,14,21,1,19,0,30,0,56,17,22,0,23,11,14,21,0,21,0,38,0,26,0,45,0,13,0,45,21,0,23,8,8,7,16,0,15,0,45,21,1,19,0,30,16,0,46,0,0,8,8,0,2,0,17,19,0,1,0,18,19,21,0,22,17,22,0,24,11,14,21,0,24,0,29,0,45,0,28,8,21,0,18,0,26,21,0,20,17,0,36,0,33,7,21,1,19,17,17,0,34,16,22,0,25,11,14,21,0,25,0,38,0,30,7,16,0,36,0,33,7,21,1,19,17,0,41,0,0,7,16,22,0,26,11,14,21,0,18,0,26,0,45,21,0,17,8,0,47,21,0,15,0,31,21,0,16,17,0,0,21,0,25,0,13,16,17,0,0,21,1,21,17,8,16,0,26,0,45,21,0,20,8,0,47,21,0,24,0,31,21,0,25,17,0,0,21,1,21,17,8,16,0,26,21,1,20,0,33,21,0,18,17,0,10,21,0,19,17,0,8,16,0,10,21,0,20,17,17,22,0,18,12,14,21,1,11,0,33,21,0,18,17,0,9,0,45,0,18,0,10,21,1,13,0,29,0,54,0,58,3,2,17,0,33,21,0,18,17,19,0,20,0,57,19,0,22,0,13,19,8,16,0,8,16,0,36,0,26,7,22,0,18,13,14,21,1,11,0,33,21,0,18,17,0,9,21,1,13,0,29,0,52,0,53,3,2,17,0,33,21,0,18,17,0,36,0,20,7,0,57,17,0,23,0,57,17,17,0,8,16,0,36,0,26,7,22,0,18,13,14,21,0,21,0,38,0,30,7,16,0,36,0,1,7,21,1,19,0,30,16,17,0,36,0,3,0,43,0,5,8,7,21,0,22,17,0,6,0,51,17,0,14,0,45,0,54,8,0,46,0,9,8,0,0,0,18,19,21,0,21,0,38,0,30,0,45,0,56,8,7,16,0,14,21,0,23,17,17,22,0,27,11,14,21,1,21,0,1,21,0,18,17,21,0,25,0,13,16,0,46,0,11,8,0,9,0,15,0,45,0,51,8,19,16,22,0,28,11,14,21,1,22,0,29,21,0,18,0,5,21,1,21,17,17,0,26,0,45,21,0,28,8,0,47,21,0,27,8,16,22,0,29,11,14,21,1,16,0,22,0,53,17,0,33,21,0,18,17,0,2,0,53,17,0,0,22,0,18,13,14,21,0,18,21,0,29,21,0,26,21,0,16,0,20,21,0,25,0,23,21,0,26,17,17,3,4,25,21,1,18,22,0,3,22,0,4,22,0,5,22,0,6,4,4,11,14,21,1,17,0,30,16,0,46,0,1,8,0,25,0,43,0,41,0,2,0,45,0,59,8,0,46,0,0,8,7,8,9,22,0,7,11,14,21,0,7,0,23,0,45,0,57,8,21,0,7,9,0,1,9,3,2,0,48,0,30,0,14,21,0,3,19,8,22,0,8,11,14,0,23,0,45,0,57,0,46,0,0,8,8,0,51,0,13,0,4,0,59,19,0,3,21,0,7,19,3,2,0,48,0,13,0,11,0,51,19,8,9,0,0,0,22,0,43,21,0,7,8,19,0,45,21,0,4,0,11,16,0,46,0,31,8,8,22,0,9,11,14,0,60,0,61,21,0,9,3,3,0,48,0,29,0,31,21,0,5,21,0,6,3,2,19,0,30,9,8,22,0,10,11,14,0,90,0,11,16,0,31,21,1,7,17,0,31,21,0,1,17,0,30,16,22,0,11,11,14,21,0,1,0,22,21,0,11,17,21,0,10,0,23,0,45,0,57,8,21,0,10,9,0,1,9,3,2,0,48,0,30,0,14,21,0,3,19,8,16,22,0,12,11,14,21,0,12,21,0,1,0,13,16,0,11,21,0,11,17,0,49,0,36,0,17,0,23,0,57,0,0,21,0,11,17,19,21,0,8,9,0,4,0,59,19,0,46,0,2,8,7,8,21,0,1,17,25,0,62,22,0,3,11,14,21,0,1,0,6,0,57,17,0,40,0,4,7,21,0,3,17,0,5,16,22,0,4,11,14,21,0,4,0,0,0,57,17,0,26,16,0,32,16,0,27,16,0,27,16,22,0,5,11,14,21,0,1,15,8,21,0,4,17,0,29,21,0,5,17,25,21,0,2,22,0,3,22,0,4,4,2,11,14,21,0,1,0,31,0,18,0,7,0,54,19,0,4,0,56,19,0,2,0,12,0,45,0,13,8,19,0,17,19,21,1,13,17,22,0,5,11,0,42,0,0,7,16,0,27,16,22,0,6,11,14,21,1,13,0,29,0,54,0,52,3,2,17,0,33,21,0,1,17,0,2,21,0,5,17,22,0,7,11,14,21,1,14,0,33,21,0,1,17,0,10,0,45,0,25,0,45,0,57,8,8,16,22,0,8,11,14,21,0,8,0,29,0,45,21,0,6,8,0,47,0,25,0,45,0,56,8,8,16,22,0,9,11,14,21,0,9,0,10,21,0,8,17,22,0,10,11,14,21,0,8,0,29,21,0,6,17,0,27,16,0,36,0,29,7,22,0,6,13,14,21,0,10,0,8,16,0,2,22,0,4,13,14,0,51,0,12,21,0,5,17,22,0,11,11,14,21,0,4,0,15,0,57,17,0,10,21,0,4,0,14,0,52,17,0,29,0,45,21,0,6,8,0,47,0,25,0,45,0,56,8,8,16,17,0,18,0,2,0,45,0,13,0,43,0,24,8,0,0,0,57,19,8,0,42,0,6,7,9,0,44,0,14,8,0,10,0,45,0,8,8,19,0,9,0,17,19,21,1,13,0,30,0,57,17,0,14,21,0,1,17,0,11,21,0,10,17,17,0,0,22,0,4,13,14,21,1,11,0,33,21,0,1,17,0,10,21,0,8,17,0,10,21,0,11,17,0,29,0,36,0,20,7,0,1,0,20,0,43,0,42,0,0,7,8,19,0,57,19,0,27,0,46,0,27,0,46,0,36,0,29,7,8,0,1,0,36,0,29,7,19,0,29,0,45,0,27,8,0,17,19,8,0,17,0,20,0,56,19,19,21,0,6,17,0,23,0,56,17,0,0,0,57,17,0,42,0,0,7,16,0,27,16,22,0,12,11,14,21,0,7,0,29,21,0,12,17,0,42,0,0,7,16,22,0,13,11,0,27,16,22,0,14,11,14,21,0,14,0,36,0,29,7,22,0,12,13,14,21,0,14,0,36,0,29,7,22,0,13,13,14,21,0,12,0,36,0,29,7,22,0,1,13,14,21,0,7,0,29,21,0,12,17,22,0,15,11,14,0,51,0,11,21,0,15,17,0,26,16,22,0,16,11,14,0,51,0,12,21,0,15,17,22,0,17,11,0,42,0,0,7,16,22,0,18,11,14,0,51,0,46,0,20,8,0,42,0,0,7,9,0,26,0,57,0,20,21,0,17,17,19,0,18,0,20,0,51,19,0,22,0,13,19,0,46,0,1,8,9,22,0,19,11,14,0,18,0,0,21,1,16,0,30,0,53,17,19,0,33,21,0,1,19,21,0,19,9,0,23,0,57,19,0,11,0,51,19,22,0,20,11,14,0,58,0,19,16,21,0,20,16,0,2,0,54,17,0,6,0,52,0,19,16,21,0,20,16,17,0,2,0,54,17,0,0,0,52,0,24,16,21,0,20,16,17,0,20,0,51,17,22,0,21,11,14,21,0,4,0,29,21,0,12,17,0,29,0,45,21,0,16,8,0,47,0,58,0,24,16,0,26,0,45,0,15,0,45,0,54,8,0,0,0,57,19,8,16,0,29,21,0,21,0,23,0,57,17,17,8,16,22,0,4,12,14,21,1,21,0,1,21,0,1,17,22,0,22,11,21,0,3,0,46,0,11,8,0,9,0,15,0,45,0,51,8,19,16,22,0,23,11,0,26,16,22,0,24,11,14,21,0,1,0,29,21,0,24,17,22,0,25,11,14,21,1,16,0,33,21,0,1,17,0,26,16,22,0,26,11,14,21,1,12,0,30,16,0,14,21,0,1,17,0,29,21,1,12,0,33,21,0,1,17,0,2,0,45,0,13,0,43,0,24,8,8,16,0,42,0,6,7,16,17,22,0,27,11,14,21,0,7,0,1,21,0,5,17,0,29,21,0,12,17,0,42,0,0,7,16,0,27,16,22,0,6,12,14,21,0,12,0,29,21,0,6,17,22,0,28,11,14,21,0,8,0,1,21,0,9,17,0,29,21,0,28,17,0,12,0,26,0,44,0,1,8,0,11,19,0,51,17,0,36,0,3,7,0,54,17,0,0,0,57,17,22,0,29,11,14,21,1,13,0,30,0,53,17,0,14,21,0,1,17,0,29,21,0,6,17,0,26,16,22,0,30,11,14,21,0,8,0,29,21,0,28,17,0,27,16,22,0,31,11,0,36,0,29,7,22,0,6,13,14,21,0,12,0,29,21,0,6,17,22,0,28,12,14,21,0,6,0,36,0,29,7,22,0,1,13,14,21,0,6,0,36,0,29,7,22,0,4,13,14,21,0,28,0,36,0,29,7,22,0,11,13,14,21,0,8,0,12,21,0,9,17,0,29,21,0,28,17,0,26,16,22,0,32,11,14,21,0,6,0,27,16,22,0,33,11,14,21,0,31,0,27,16,0,29,22,0,30,13,14,21,1,11,0,33,21,0,1,17,22,0,34,11,14,21,0,8,0,29,21,0,28,17,0,10,21,0,11,17,0,10,21,0,34,17,22,0,35,11,14,21,1,12,0,22,0,54,17,0,33,21,0,1,17,22,0,36,11,14,21,0,36,0,10,21,0,35,17,0,1,22,0,4,13,14,0,54,0,16,21,0,4,17,22,0,37,11,14,0,52,0,14,21,0,4,17,0,25,0,57,17,0,10,0,57,0,16,21,0,4,17,17,22,0,38,11,14,21,0,38,0,29,21,0,35,0,25,0,56,17,0,2,0,45,0,13,0,43,0,24,8,8,16,0,42,0,6,7,16,17,22,0,39,11,14,21,0,38,0,25,0,57,17,0,9,21,1,12,0,30,0,57,17,0,14,21,0,1,17,17,0,11,21,0,39,17,22,0,40,11,14,0,52,0,14,21,0,4,17,0,25,0,57,17,0,11,21,0,36,17,0,10,21,0,37,17,22,0,41,11,14,21,0,40,0,10,21,0,41,17,0,8,16,0,25,16,0,2,0,43,0,42,0,6,7,8,0,1,0,17,19,0,45,0,13,0,43,0,24,8,8,16,0,25,16,22,0,42,11,14,21,0,36,0,26,16,21,0,42,0,46,0,29,8,0,0,0,57,19,0,0,0,18,19,16,22,0,43,11,14,0,57,0,1,21,0,43,17,0,33,21,0,1,0,13,16,0,24,16,17,0,18,0,20,0,51,19,0,22,0,13,19,0,46,0,1,8,16,0,29,21,0,33,17,0,42,0,0,7,16,0,25,0,56,17,22,0,44,11,0,29,21,0,6,17,22,0,45,11,14,21,0,4,0,26,0,45,21,0,45,8,0,47,0,38,0,56,7,8,16,22,0,4,12,14,21,0,41,0,8,16,0,42,0,0,7,0,2,0,43,0,42,0,6,7,8,0,1,0,18,19,21,0,35,19,0,15,0,11,0,7,19,0,54,19,0,9,0,18,19,16,0,9,21,0,35,0,2,0,45,0,13,0,43,0,24,8,0,0,0,57,19,8,0,42,0,6,7,9,0,44,0,15,8,21,0,36,17,17,22,0,46,11,14,21,0,36,0,10,21,0,35,17,0,36,0,20,7,0,51,17,0,23,0,57,17,0,12,21,0,37,17,22,0,47,11,14,21,0,47,0,26,16,0,25,16,22,0,48,11,14,21,0,47,0,25,0,56,17,0,11,21,0,37,17,0,10,0,57,0,14,21,0,4,17,17,0,11,21,0,47,0,25,0,57,17,0,9,21,0,41,17,17,0,9,21,0,39,0,8,16,0,10,21,0,46,17,17,0,11,21,0,45,0,25,0,57,17,17,0,26,16,22,0,49,11,14,0,51,0,14,21,0,4,17,0,11,21,0,41,17,0,10,0,51,0,16,21,0,4,17,0,9,21,0,39,17,17,0,9,21,1,15,0,30,16,0,13,21,0,1,17,17,0,36,0,20,7,0,51,17,0,23,0,57,17,0,29,21,0,49,17,22,0,50,11,14,21,0,3,0,0,21,1,21,17,0,16,21,0,1,17,22,0,51,11,14,21,1,10,0,30,0,56,17,0,15,21,0,1,17,0,10,21,0,51,17,0,26,16,22,0,52,11,14,21,0,1,0,29,21,0,52,17,22,0,53,11,0,34,16,0,9,16,22,0,54,11,14,21,1,13,0,30,0,58,17,0,14,21,0,1,0,26,21,0,11,17,17,22,0,55,11,14,0,57,0,20,21,0,35,17,0,9,21,0,11,0,20,0,57,17,17,0,1,0,51,0,20,21,0,34,17,17,0,42,0,0,7,16,0,26,0,57,0,20,21,0,11,17,17,0,23,0,45,0,1,8,0,1,0,23,19,0,57,17,0,26,21,0,55,17,0,0,0,57,17,22,0,56,11,14,21,0,55,0,20,0,51,17,0,29,0,45,0,42,0,0,7,8,21,0,11,17,0,12,21,0,34,17,0,26,16,22,0,57,11,14,21,1,13,0,30,0,54,17,0,14,21,0,1,17,0,26,16,22,0,58,11,14,21,0,44,0,9,21,0,27,17,0,9,21,0,23,17,22,0,59,11,0,29,21,0,24,17,22,0,60,11,14,21,0,59,21,0,19,16,22,0,61,11,14,21,0,18,0,29,21,0,24,17,0,36,21,0,14,0,29,21,0,16,17,0,20,21,0,1,0,13,16,17,7,0,29,0,26,0,45,21,0,60,8,19,0,20,21,0,14,0,26,21,0,17,17,0,20,0,56,17,0,46,0,29,8,19,16,0,27,16,22,0,62,11,14,21,0,62,0,29,0,45,21,0,25,0,26,0,45,21,0,60,8,0,46,0,20,8,16,0,46,0,29,8,0,27,9,8,16,0,29,0,45,21,0,60,0,36,0,26,7,16,0,1,16,0,20,21,0,60,17,0,46,0,29,0,43,0,42,0,0,7,8,8,0,27,9,8,16,0,26,0,45,21,0,24,0,13,16,0,46,0,11,8,8,16,22,0,62,12,14,21,0,24,0,29,0,45,21,0,62,8,0,47,0,29,0,45,0,2,0,45,0,13,0,43,0,24,8,8,0,42,0,6,7,9,8,8,21,0,60,17,22,0,63,11,14,21,0,22,0,29,21,0,26,17,0,0,0,54,17,0,15,0,45,0,51,8,0,46,0,0,8,16,0,0,21,0,21,0,7,0,54,17,0,2,0,52,17,0,29,21,0,18,0,29,21,0,26,17,17,17,0,20,21,0,59,0,42,0,0,7,16,0,8,0,45,0,2,0,45,21,0,17,8,0,42,0,6,7,9,8,16,0,1,21,1,23,0,29,21,0,21,17,0,29,21,0,18,17,17,0,29,21,0,63,17,17,22,0,64,11,14,21,0,26,0,20,21,0,24,17,22,0,65,11,0,11,16,0,19,0,52,17,0,20,16,22,0,66,11,14,21,0,44,0,29,21,0,65,17,0,0,0,63,17,21,0,26,0,38,0,51,7,16,0,20,21,0,63,21,0,13,0,46,0,29,8,0,44,0,1,8,21,0,24,17,17,21,0,64,3,3,22,0,67,11,14,21,0,33,0,29,22,0,16,13,14,21,0,52,21,0,52,21,0,16,21,0,16,21,0,58,21,0,57,21,0,30,21,0,30,21,0,32,21,0,32,21,0,43,21,0,42,0,29,21,0,48,17,0,6,0,57,17,0,0,21,0,48,17,21,0,50,0,0,21,0,49,17,0,0,0,45,21,0,42,0,46,0,29,8,0,2,21,0,50,19,8,16,3,13,0,20,16,0,36,0,29,7,21,0,6,17,0,20,21,0,66,17,0,27,16,22,0,68,11,14,21,0,52,0,38,0,51,7,16,21,0,53,0,31,21,0,54,17,21,0,16,0,38,0,64,7,16,21,0,16,0,13,16,0,24,16,0,0,0,57,17,3,4,0,20,21,0,67,17,0,20,16,22,0,69,11,14,21,0,58,0,38,0,65,7,16,21,0,57,0,38,0,66,7,16,21,0,45,0,29,21,0,30,17,0,0,0,52,17,21,0,56,21,0,45,0,29,21,0,32,17,0,0,0,52,17,21,0,29,21,0,1,0,0,21,0,40,17,0,26,21,0,36,17,0,0,21,1,12,0,30,16,0,1,0,67,17,17,21,0,4,0,29,21,0,48,17,0,0,0,53,17,21,0,39,0,29,21,0,49,17,0,2,0,69,17,0,1,21,0,50,17,0,0,0,68,17,0,14,0,45,0,59,8,0,2,0,50,19,0,0,0,18,19,16,3,9,0,20,16,0,20,21,0,69,17,0,29,21,0,68,17,22,0,70,11,14,21,1,23,0,29,21,0,21,17,0,0,21,0,61,17,0,38,0,11,0,44,0,21,8,7,21,0,58,0,13,0,44,0,24,0,46,0,0,8,8,21,0,69,17,0,33,21,0,68,17,0,20,0,57,17,0,26,16,0,36,0,29,7,21,0,70,0,6,0,57,17,0,40,0,4,7,0,62,17,0,5,16,0,0,0,57,17,0,20,0,51,17,0,42,0,0,7,16,17,17,0,38,0,20,7,0,54,0,24,0,44,0,25,0,46,0,39,0,21,7,8,8,0,52,17,0,19,16,0,29,21,0,21,17,17,22,0,71,11,14,0,65,0,20,21,0,70,17,21,1,27,16,21,0,54,21,0,71,3,3,25,21,0,1,21,1,24,16,22,0,3,22,0,4,22,0,5,22,0,6,4,4,11,14,21,0,3,21,1,28,21,0,5,21,0,4,3,2,17,22,0,7,22,0,8,22,0,9,4,3,11,14,21,0,6,0,38,21,1,26,7,16,0,20,21,0,2,17,0,29,21,1,21,0,16,21,0,8,17,0,2,21,0,2,0,13,16,0,1,21,0,5,17,0,0,21,1,21,17,17,0,1,21,0,8,17,17,22,0,10,11,14,21,0,7,21,0,10,21,0,9,3,3,25,21,0,1,0,25,16,0,30,16,0,14,0,51,17,25,21,0,1,0,29,0,45,21,0,2,0,26,21,0,1,17,8,0,47,0,38,0,57,7,8,16,21,1,9,21,0,2,0,36,0,29,7,16,17,25,21,0,2,0,2,16,22,0,3,11,14,21,0,1,21,0,3,0,41,0,10,7,16,0,49,0,26,0,45,21,0,3,8,0,44,21,1,3,0,46,0,3,8,0,5,9,0,46,21,0,0,8,8,0,20,0,7,0,0,21,0,3,0,46,0,2,8,19,0,45,21,1,3,8,19,8,0,57,0,1,21,0,2,17,17,25]) + ,[runtime[0],runtime[1],runtime[2],runtime[3],runtime[4],runtime[6],runtime[7],runtime[8],runtime[9],runtime[10],runtime[11],runtime[12],runtime[13],runtime[14],runtime[15],runtime[16],runtime[17],runtime[20],runtime[21],runtime[22],runtime[23],runtime[24],runtime[25],runtime[26],runtime[27],runtime[28],runtime[30],runtime[31],runtime[32],runtime[33],runtime[34],runtime[35],runtime[36],runtime[37],runtime[38],runtime[39],runtime[41],runtime[42],runtime[43],runtime[44],runtime[45],runtime[46],runtime[48],runtime[49],runtime[50],runtime[51],runtime[52],runtime[53],runtime[55],runtime[58],9,0,3,5,2,6,-1,1,4,10,3.14159265358979,Infinity,128,21,15,25,14,11,16,7,'\t','\n',str("0123456789"),str("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),str("abcdefghijklmnopqrstuvwxyz"),str("+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!"),str("˜˘¨⌜⁼´˝`"),str("∘○⊸⟜⌾⊘◶⎉⚇⍟"),str("⋄,"),str("←↩→"),str("(){}⟨⟩"),str("‿"),str("·"),str("𝕊𝕏𝕎𝔽𝔾𝕤𝕩𝕨𝕗𝕘"),str("¯.π∞"),str("_"),str(" "),'#','\'','"','e',str("'")] + ,[[0,1,0,30],[0,0,359,30],[0,0,1484,13],[0,0,1801,6],[0,0,1874,72],[0,0,4856,11],[0,0,4979,3],[0,0,4994,3],[0,0,5034,4]] +) +let bqn = src => run.apply(null,compile(str(src),runtime)); + +if(typeof module!=='undefined'){module.exports=bqn;} diff --git a/src/c.bqn b/src/c.bqn new file mode 100644 index 00000000..eed5f843 --- /dev/null +++ b/src/c.bqn @@ -0,0 +1,132 @@ +#! ./dzref + +tab←' '⋄nl←' +' +dig ← "0123456789" +alph ← "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +alow ← "abcdefghijklmnopqrstuvwxyz" +charSet←∾charGroups←⟨ + chF←"+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!" # Function + "˜˘¨⌜⁼´˝`" # Modifier + "∘○⊸⟜⌾⊘◶⎉⚇⍟" # Composition + nl∾"⋄," # Separator + "←↩→" # Gets + "(){}⟨⟩" # Bracket + "‿" # Ligature + "·" # nOthing + "𝕊𝕏𝕎𝔽𝔾𝕤𝕩𝕨𝕗𝕘" # Input (𝕣 pending; ℝ not allowed) + dig # Digit + "¯.π∞" # Numeric + alow∾alph∾"_" # Alphabetic + " "∾tab # Whitespace +# #'" eliminated during tokenization +⟩ +bF‿bM‿bC‿bS‿bG‿bB‿bL‿bO‿bI‿bD‿bN‿bA‿bW←⊔/≠¨charGroups +vi←+´≠¨9↑charGroups +charRole←((vi-≠bI)↑/0∾≠¨3↑charGroups)∾(5/⌽↕2)∾0 +spc←⥊3‿5‿6-⌜3‿0 + +Tokenize←{ + r←𝕩='#'⋄s←/(≠↑2⊸↓)⊸∧𝕩='''⋄d←/𝕩='"' + g←⍋q←∾⟨ s⋄¯1↓d⋄/r⟩ ⋄q↩g⊏q + e← g⊏∾⟨2+s⋄ 1↓d⋄(⊢-¯1↓0∾⊢)∘⊏⟜(0∾+`r)⊸//(𝕩=nl)∾1⟩ + Se←{(⊏˜𝕨)Se 1¨⌾((𝕩/𝕨)⊸⊏)𝕩}⍟{0=⊑⌽𝕩} + st←¯1↓Se⟜(1↑˜≠)∾⟜≠q⍋e⋄b←st/q∾˘e + ToI←¯1↓·/⁼(≠𝕩)∾˜⥊⋄f←¬≠`ToI b + cb←(¬(st/q)⊏r)/b + lu←⍷lit←𝕩⊔˜1-˜(+`ToI⊑˘cb)×≠`ToI cb + cl←f/ToI⊑∘⌽˘cb + + c←charSet⊐f/𝕩 + w←(≠↑0∾⊢)⊸ׯ1⋆2|⊢)⊐)𝕩⋄br←p×𝕩∊2‿3⊏bB + sl←1⊸⌽⊸∨𝕩∊bL⋄sr←¯1⊸⌽⌾(g⊸⊏)sl⋄sa←sl∨sr + g⊏˜↩⍋g⊏sl⋄r×↩¬sa⋄o←p>0 + r+↩(sa<𝕩=1⊑bB)(⊣∧¬⊸∨=○(⌈`(1+↕∘≠)⊸×)⊢)(¯1⊸⌽⌾(g⊸⊏)3=r)∨1≤r + rev←⍋+`1+¯1↓g((¯1∾⊣)(⊣⍋⊸⊏⊏˜-⊏˜⟜⍋)⟜⍋1(+`∘∾-∾˜)⊏)o∨sl∨𝕩∊bS + + gf←⍋fd←+`rev⊏br + rev⊏˜↩gf⋄fd⊏˜↩gf + 𝕩⊏˜↩rev⋄bv←rev⊏br⋄b←/bv<0⋄fi←+`c←bv>0 + + FC←-⟜(≠↑0∾⊢)(c∾1)/·+`∾⟜0 + H←0<1↓·FC𝕩∊(5⊑bI)+⊢ + ft←0∾(H↕3)+2×(H⥊3)⌈2×H⥊4 + r↩((1↓ft)⊏(1+2⊸≤)⊸/↕4)⌾(b⊸⊏)rev⊏r + + id←/idm←(0⊸≤∧<⟜nv)xv←𝕩-vi⋄idx←id⊏𝕩⋄sp←/𝕩∊bI + ad←(⌈`↕∘≠⊸×𝕩∊bG)⊏𝕩=⊑bG + + g↩⍋+`rev⊏p-br⋄gr←g⊏rev⋄sll←1+2÷˜0(<-○/>)gr⊏sr-sl⋄l←/g⊏𝕩=5⊑bB + g⊏˜↩gs←⍋gr⊏sl⋄gr↩g⊏rev⋄𝕩⊏˜↩g⋄r⊏˜↩g⋄o⊏˜↩gr⋄si←/gr⊏sr>sl + gi←⍋g⋄l⊏↩⍋gs + s←𝕩∊bS⋄ps←s∨o∨gr⊏sl⋄a←𝕩∊2↑bG + r-↩ps∨a⋄op←r≥2⋄fe←(r≥1)∨1⌽r=3 + tr←(⌈`↕∘≠⊸ׯ1⌽ps)⊏fe + ma←tr<(𝕩=1⊑bG)∧1⌽fe + ro←op∨a<1⌽r=3⋄os←⌽↕∘≠⊸(⊣-⌈`∘×)⌽¬ro∨ma⋄at←(⊢+1+⊏⟜os)/a + aa←g⊏asn←¯1⌽+`gi⊏-⟜(≠↑0∾⊢)(↕≠𝕩)∊at-1⋄r↩¯1¨⌾(aa⊸/)r + tf←(a≤○(⌈`(1+↕∘≠)⊸×)ps)∧(⊢∧2(|<≤)ps(⊢-⌈`∘×)+`)¬ro + opa←op>1↓0∾˜ps∨a + oa←⌽/opa⋄fa←/(1⌽aa)<(tf∨¬tr)∧(ro∧1⌽opa)<(r=1)∨op<¯1⌽opa + dy←fa⊏1↓0∾˜(𝕩≠⊑bO)∧(tr∧r≥0)∨roo+`⊸⊏0∾lo⋄rt←/𝕩=2⊑bB + + d←id⊏dec←idm∧ad∧asn⋄lc←FC dec + ig←⍋(⊏⟜(¯1∾c/gf)∾d⊸/⊏((≠𝕩)∾b⊏gf)˜)id⊏fi + ig↩<⟜(≠id)⊸/(⍋+`∘⊏⟜(d∾-/˜d))⊸⊏(⍋⊏⟜(∾⟜(d⊸/)idx))⊸⊏ig + ui←d(⌈`↕∘≠⊸×)⊸⊏⌾(ig⊸⊏)id + ii←(ui⊏(fi⊏ft⊏spc)-(⌈`c⊸×)⊸¬+`dec)∾((sp⊏fi)⊏3×2|ft)++⟜(0⊸≤)2+sp⊏xv + idor←∾3⥊≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!" + "˜˘¨⌜⁼´˝`" + "∘○⊸⟜⌾⊘◶⎉⚇⍟" +⟩ +nc ← ≠¨chrs +chr ← ∾chrs +itr ← 0⥊˜≠chr + +init ← " "⊸∾¨(/⟜"_"¨nc/0‿1‿1)∾¨(nc/"FMD")∾¨(nc+´⊸↑⥊"ABC"∾⌜•a) +post ← ∾⟜" "¨/⟜"_"¨nc/0‿0‿1 +names ← init∾¨(•UCS 48)∾¨post + +Inc ← { + i←⊑chr⊐𝕩 + n←0 ⋄ itr↩{n↩1+𝕩}⌾(i⊑⊢)itr + names↩((i⊑init)∾(•UCS 48+n)∾i⊑post)⌾(i⊑⊢)names +} + +# Required functionality passed in as an argument +pnam ← ⟨"IsArray", "Type", "Log"⟩∾names⊏˜chr⊐"!+-×÷⋆⌊=≤≢⥊⊑↕⌜`" + + +E_isdef ← (3≤≠)◶⟨0,∧´⟨chr," ","←↩"⟩∊˜¨3⊸↑⟩ +E_proc ← { + l←≠chr + q←≠`𝕩∊"""'" ⋄ f←¬∨`q¬⊸∧𝕩='#' + ∾ (((l×f/q)+chr⊸⊐) (≥⟜l)◶⟨⊑⟜names,⥊∘⊢⟩¨ ⊢) f/𝕩 +} +E_redef ← { # handles [fmd] [←↩] + tail ← E_proc 3↓𝕩 # must use old def + Inc ⊑𝕩 + (E_proc 1↑𝕩) ∾ "←" ∾ tail +} + +ref ← ∾ ∾⟜(•UCS 10)¨ ∾⟨ + ⟨"{"⟩ + ⟨"←𝕩"∾˜"⟨"∾"⟩"∾˜1↓∾","⊸∾¨pnam⟩ + E_isdef◶E_proc‿E_redef¨ impl∾<"⟨"∾"⟩"∾˜1↓⥊","⊸∾˘∾chrs + ⟨"}"⟩ +⟩ diff --git a/test/tj.js b/test/tj.js new file mode 100755 index 00000000..7fa44614 --- /dev/null +++ b/test/tj.js @@ -0,0 +1,27 @@ +//usr/bin/env node "$0" $@;exit $? + +const bqn=require(__dirname+'/../bqn.js') + , load=f=>require('fs').readFileSync(__dirname+'/'+f,'utf8'); + +if (process.argv.length <= 2) { + const t=load('cases.bqn').split('\n').filter(x=>x).map(x=>x.split(' % ')) + , test=t.map(e=>e[1]) + , expt=t.map(e=>+e[0]); +//let test= load('testref.bqn').split('\n') +// .filter(x=>x.charAt(0)===' ' +// &&x.charAt(1)===' ' +// &&x.charAt(2)!=='#' +// &&x.indexOf(':')===-1 +// &&x.indexOf('e¯')===-1) +// .map(x=>x.slice(2)) +// , t=test.map(e=>[0,e]) +// , expt=test.map(e=>1); + + test.map((t,i) => { + console.log(t); + let e=expt[i], r=bqn(t); + console.log(e===r ? " Passed!" : " Expected "+e+" but received "+r); + }); +} else { + console.log(process.argv.slice(2).map(bqn)); +} -- cgit v1.2.3