diff options
| author | Marshall Lochbaum <mwlochbaum@gmail.com> | 2021-05-05 15:53:02 -0400 |
|---|---|---|
| committer | Marshall Lochbaum <mwlochbaum@gmail.com> | 2021-05-05 15:53:02 -0400 |
| commit | d8cf97d0894e0a77a62164a790e7a9875f767ec9 (patch) | |
| tree | 1b18f208358c32a44b6abb7203bf1cbbe859029a | |
| parent | bd1820847dcd69da4b65400e2a0a81996a97e022 (diff) | |
Support cross-program namespace access
| -rw-r--r-- | docs/bqn.js | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/docs/bqn.js b/docs/bqn.js index ee6df27c..f75f5f9a 100644 --- a/docs/bqn.js +++ b/docs/bqn.js @@ -10,6 +10,20 @@ let call = (f,x,w) => { return f(x, w); } +let findkey = (ns, names, i) => { + let nn=ns.names, ni; + if (nn===names) { + return ns[i]; + } else { + if (!has(nn.rev)) { let m=nn.rev={}; nn.forEach((s,i)=>m[s]=i); } + return ns[nn.rev[names[i]]]; + } +} +let readns = (v, vid, i) => { + let ni = findkey(v.ns, vid.names, vid[i]) + if (!has(ni)) throw Error("← or ↩: Unknown namespace key"); + return v[ni]; +} let getv= (a,i) => { let v=a[i]; if (v===null) throw Error("Runtime: Variable referenced before definition"); return v; } let get = x => x.e ? getv(x.e,x.p) : arr(x.map(c=>get(c)), x.sh); let set = (d, id, v) => { @@ -24,9 +38,7 @@ let set = (d, id, v) => { } else if (v.ns) { id.map(n=>{ if (!n.e) throw Error("← or ↩: Cannot extract non-name from namespace"); - let ni = v.ns[n.e.vid[n.p]]; - if (!has(ni)) throw Error("← or ↩: Unknown namespace key"); - set(d,n,v[ni]); + set(d,n,readns(v, n.e.vid, n.p)); }); } else { throw Error("← or ↩: Multiple targets but atomic value"); @@ -71,7 +83,7 @@ let genjs = (B, p, L) => { // Bytecode -> Javascript compiler } return "let "+new Array(szM).fill().map((_,i)=>rV(i)).join(',')+";"+r+fin; } -let run = (B,O,S,L) => { // Bytecode, Objects, Sections/blocks, Locations +let run = (B,O,S,L,T) => { // Bytecode, Objects, Sections/blocks, Locations, Tokenization let train2=( g,h)=>{ let t=(x,w)=>call(g,call(h,x,w)); t.repr=()=>[2, g,h];return t;} let train3=(f,g,h)=>{if(!has(f))return train2(g,h);let t=(x,w)=>call(g,call(h,x,w),call(f,x,w));t.repr=()=>[3,f,g,h];return t;} let D = S.map(([type,imm,pos,varam,vid,vex],i) => { @@ -80,6 +92,7 @@ let run = (B,O,S,L) => { // Bytecode, Objects, Sections/blocks, Locations let def = new Array(sp + varam).fill(null); let ns = {}; if (vex) vex.forEach((e,j)=>{if(e)ns[vid[j]]=j+sp;}); vid = (new Array(sp).fill(null)).concat(vid); + if (T) ns.names = vid.names = T[2][0]; let c = genjs(B, pos, L); let repdf = ["","4,f,mod","5,f,mod,g"].map(s=>s?"fn.repr=()=>["+s+"];":s); if (imm) c = "const e=[...e2];e.vid=vid;e.p=oe;"+c; |
