aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorMarshall Lochbaum <mwlochbaum@gmail.com>2022-01-06 22:01:50 -0500
committerMarshall Lochbaum <mwlochbaum@gmail.com>2022-01-06 22:16:08 -0500
commitfd8b59ca7c4cd5725b0ac80ea74e6f91fd0d6d0b (patch)
tree2ce0f68e017f3df3f1e92560f16dc188c5452cc9 /docs
parentada4aa0b7b2897efef1f0e506bf9f11826728435 (diff)
Add •ns.Has and •ns.Get, taking namespace on the left, and •ns.Map
Diffstat (limited to 'docs')
-rw-r--r--docs/bqn.js32
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 = (() => {