diff options
| author | Marshall Lochbaum <mwlochbaum@gmail.com> | 2022-01-06 22:01:50 -0500 |
|---|---|---|
| committer | Marshall Lochbaum <mwlochbaum@gmail.com> | 2022-01-06 22:16:08 -0500 |
| commit | fd8b59ca7c4cd5725b0ac80ea74e6f91fd0d6d0b (patch) | |
| tree | 2ce0f68e017f3df3f1e92560f16dc188c5452cc9 /docs/bqn.js | |
| parent | ada4aa0b7b2897efef1f0e506bf9f11826728435 (diff) | |
Add •ns.Has and •ns.Get, taking namespace on the left, and •ns.Map
Diffstat (limited to 'docs/bqn.js')
| -rw-r--r-- | docs/bqn.js | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/docs/bqn.js b/docs/bqn.js index fd8b8301..191cb8b3 100644 --- a/docs/bqn.js +++ b/docs/bqn.js @@ -16,6 +16,10 @@ let getrev = names => { m={}; names.forEach((s,i)=>m[s]=i); return names.rev=m; } +let nsget = x => { + let rev = getrev(x.ns.names); + return s => (i=>has(i)?x[x.ns[i]]:i)(rev[s]); +} let findkey = (ns, names, i) => { let nn=ns.names; return ns[nn===names ? i : getrev(nn)[names[i]]]; @@ -535,9 +539,7 @@ let rebqn = dynsys_copy(state => (x,w) => { let req = (r,s) => { if (!r) throw Error("•ReBQN: "+s) }; req(!has(w), "𝕨 not allowed"); req(x.ns, "𝕩 must be a namespace"); - let rev = getrev(x.ns.names); - let [repl,primitives] = ["repl","primitives"] - .map(s=>(i=>has(i)?x[x.ns[i]]:i)(rev[s])); + let [repl,primitives] = ["repl","primitives"].map(nsget(x)); if (has(primitives)) { addprimitives(state, primitives); } let cmp = makebqnfn("•ReBQN evaluation", r=>r)(state); @@ -593,7 +595,29 @@ let nsns = (() => { if (has(w)||!x.ns) throw Error("•ns.Keys: Takes one namespace argument"); return list(listkeys(x).map(str)); } - return makens(["keys"], [keys]); + let req1name = (e,x,w) => req1str(e,x,w).replaceAll("_","").toLowerCase(); + let getq = (e,x,w) => { + if (!has(w)||!w.ns) throw Error(e+": 𝕨 must be a namespace"); + return nsget(w)(req1name("•ns."+e,x)); + } + let hasq = (x,w) => +has(getq("Has",x,w)); + let get = (x,w) => { + let v = getq("Get",x,w); + if (!has(v)) throw Error("•ns.Get: key not found"); + return v; + } + let map = (x,w) => { + if (has(w)||!x.ns) throw Error("•ns.Map: Takes one namespace argument"); + let g=nsget(x), getq = (e,x,w)=>g(req1name("Namespace map."+e,x,w)); + let hasq = (x,w) => +has(getq("Has",x,w)); + let get = (x,w) => { + let v = getq("Get",x); + if (has(v)) return v; if (has(w)) return w; + throw Error("Namespace map.Has: key not found"); + } + return makens(["has","get"], [hasq,get]); + } + return makens(["keys","has","get","map"], [keys,hasq,get,map]); })(); let rand = (() => { |
