system value inheriting
This commit is contained in:
parent
a93ea4dbaf
commit
3f62a51305
@ -270,13 +270,15 @@ B show_c1(B t, B x) {
|
|||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
B vfyStr(B x, char* name, char* arg) {
|
NOINLINE bool isStr(B x) {
|
||||||
if (isAtm(x) || RNK(x)!=1) thrF("%U: %U must be a string", name, arg);
|
if (isAtm(x) || RNK(x)!=1) return false;
|
||||||
if (!elChr(TI(x,elType))) {
|
if (elChr(TI(x,elType))) return true;
|
||||||
usz ia = IA(x);
|
usz ia = IA(x); SGetU(x)
|
||||||
SGetU(x)
|
for (usz i = 0; i < ia; i++) if (!isC32(GetU(x,i))) return false;
|
||||||
for (usz i = 0; i < ia; i++) if (!isC32(GetU(x,i))) thrF("%U: %U must be a string", name, arg);
|
return true;
|
||||||
}
|
}
|
||||||
|
NOINLINE B vfyStr(B x, char* name, char* arg) {
|
||||||
|
if (!isStr(x)) thrF("%U: %U must be a string", name, arg);
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
50
src/load.c
50
src/load.c
@ -239,6 +239,7 @@ B bqn_exec(B str, B path, B args) { // consumes all
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isStr(B x);
|
||||||
B str_all, str_none;
|
B str_all, str_none;
|
||||||
void init_comp(B* new_re, B* prev_re, B prim, B sys) {
|
void init_comp(B* new_re, B* prev_re, B prim, B sys) {
|
||||||
if (q_N(prim)) {
|
if (q_N(prim)) {
|
||||||
@ -299,17 +300,48 @@ void init_comp(B* new_re, B* prev_re, B prim, B sys) {
|
|||||||
new_re[re_sysNames] = new_re[re_sysVals] = emptyHVec();
|
new_re[re_sysNames] = new_re[re_sysVals] = emptyHVec();
|
||||||
} else {
|
} else {
|
||||||
usz ia = IA(sys); SGetU(sys)
|
usz ia = IA(sys); SGetU(sys)
|
||||||
M_HARR(r1, ia);
|
M_HARR(nns, ia);
|
||||||
M_HARR(r2, ia);
|
M_HARR(nvs, ia);
|
||||||
for (usz i = 0; i < ia; i++) {
|
i8* inh; B inhA = m_i8arrv(&inh, ia);
|
||||||
|
for (usz i = 0; i < ia; i++) { // write defined system values, inherited ones get inserted later
|
||||||
B c = GetU(sys,i);
|
B c = GetU(sys,i);
|
||||||
if (!isArr(c) || RNK(c)!=1 || IA(c)!=2) thrM("•ReBQN: 𝕩.system must be either \"all\", \"none\", or a list of pairs");
|
B nn, nv;
|
||||||
SGet(c)
|
if (isStr(c)) {
|
||||||
HARR_ADD(r1, i, Get(c,0));
|
nn = incG(c);
|
||||||
HARR_ADD(r2, i, Get(c,1));
|
nv = bi_N;
|
||||||
|
inh[i] = 1;
|
||||||
|
} else {
|
||||||
|
if (!isArr(c) || RNK(c)!=1 || IA(c)!=2) thrM("•ReBQN: 𝕩.system must be either \"all\", \"none\", or a list of names or pairs of name & value");
|
||||||
|
SGet(c)
|
||||||
|
nn = Get(c,0);
|
||||||
|
nv = Get(c,1);
|
||||||
|
inh[i] = 0;
|
||||||
|
}
|
||||||
|
HARR_ADD(nns, i, nn);
|
||||||
|
HARR_ADD(nvs, i, nv);
|
||||||
}
|
}
|
||||||
new_re[re_sysNames] = HARR_FV(r1);
|
B nnsA = HARR_FV(nns);
|
||||||
new_re[re_sysVals] = HARR_FV(r2);
|
|
||||||
|
// system value inheriting
|
||||||
|
B inhNs = C2(slash, incG(inhA), incG(nnsA));
|
||||||
|
usz inhN = IA(inhNs);
|
||||||
|
if (inhN>0) {
|
||||||
|
B prevN = prev_re[re_sysNames];
|
||||||
|
B prevV = prev_re[re_sysVals];
|
||||||
|
B idxs = C2(indexOf, incG(prevN), inhNs);
|
||||||
|
B inhNIs = C1(slash, incG(inhA));
|
||||||
|
SGetU(idxs) SGet(prevV) SGetU(inhNIs)
|
||||||
|
for (usz i = 0; i < inhN; i++) {
|
||||||
|
usz oi = o2sG(GetU(inhNIs,i));
|
||||||
|
usz idx = o2sG(GetU(idxs,i));
|
||||||
|
if (idx == IA(prevN)) thrF("•ReBQN: No system value \"%R\" to inherit", IGet(nnsA, oi));
|
||||||
|
HARR_O(nvs).a[oi] = Get(prevV, idx);
|
||||||
|
}
|
||||||
|
decG(inhNIs); decG(idxs);
|
||||||
|
} else decG(inhNs);
|
||||||
|
|
||||||
|
new_re[re_sysNames] = nnsA;
|
||||||
|
new_re[re_sysVals] = HARR_FV(nvs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,6 +34,11 @@ f←•ReBQN {repl⇐"loose" ⋄ primitives⇐⋈'÷'‿÷} ⋄ ! "Unknown chara
|
|||||||
ps ← ⟨'÷'‿÷⟩ ⋄ f←•ReBQN {repl⇐"none" ⋄ primitives⇐ps} ⋄ ! ps ≡ F "•primitives" ⋄ ! •primitives ≡ •BQN "•primitives" ⋄ ! ps ≡ F "•primitives"
|
ps ← ⟨'÷'‿÷⟩ ⋄ f←•ReBQN {repl⇐"none" ⋄ primitives⇐ps} ⋄ ! ps ≡ F "•primitives" ⋄ ! •primitives ≡ •BQN "•primitives" ⋄ ! ps ≡ F "•primitives"
|
||||||
ps ← ⟨'÷'‿÷⟩ ⋄ f←•ReBQN {repl⇐"loose" ⋄ primitives⇐ps} ⋄ ! ps ≡ F "•primitives" ⋄ ! •primitives ≡ •BQN "•primitives" ⋄ ! ps ≡ F "•primitives"
|
ps ← ⟨'÷'‿÷⟩ ⋄ f←•ReBQN {repl⇐"loose" ⋄ primitives⇐ps} ⋄ ! ps ≡ F "•primitives" ⋄ ! •primitives ≡ •BQN "•primitives" ⋄ ! ps ≡ F "•primitives"
|
||||||
|
|
||||||
|
f←•ReBQN{primitives⇐⋈'÷'‿- ⋄ system⇐⟨"foo"‿⋈, "oldbqn"‿•BQN, "bqn"⟩} ⋄ {𝕏 "÷5"}¨ F "⟨•foo, •OldBQN, •BQN⟩" %% ⟨⋈"÷5", 0.2, ¯5⟩
|
||||||
|
!"•ReBQN: No system value ""baz"" to inherit" % •ReBQN{system⇐⟨"foo"‿"bar", "bqn", "baz", "rebqn"⟩}
|
||||||
|
!"•ReBQN: No system value ""bqn"" to inherit" % f←•ReBQN{system⇐⟨"baz"‿1, "rebqn", "foo"‿2⟩} ⋄ g←F"•ReBQN" ⋄ G {system⇐⟨"foo"‿"bar", "baz", "bqn", "rebqn"⟩}
|
||||||
|
f←•ReBQN{primitives⇐⋈'÷'‿- ⋄ system⇐⟨"foo"‿⋈, "bqn", "listsys"⟩} ⋄ F"•listsys" %% ⟨"foo","bqn","listsys"⟩
|
||||||
|
|
||||||
|
|
||||||
# •primitives
|
# •primitives
|
||||||
!∧´2=•Type¨ ⊑¨•primitives
|
!∧´2=•Type¨ ⊑¨•primitives
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user