Implement •ReBQN 𝕩.primitive processing
This commit is contained in:
parent
9e5f488642
commit
89e8cf5a6c
@ -527,7 +527,6 @@ B reBQN_c1(B t, B x) {
|
|||||||
if (!isNsp(x)) thrM("•ReBQN: Argument must be a namespace");
|
if (!isNsp(x)) thrM("•ReBQN: Argument must be a namespace");
|
||||||
B repl = ns_getNUf(x, m_str8l("repl"));
|
B repl = ns_getNUf(x, m_str8l("repl"));
|
||||||
B prim = ns_getNUf(x, m_str8l("primitives"));
|
B prim = ns_getNUf(x, m_str8l("primitives"));
|
||||||
dec(x);
|
|
||||||
i32 replVal = q_N(repl) || eqStr(repl,U"none")? 0 : eqStr(repl,U"strict")? 1 : eqStr(repl,U"loose")? 2 : 3;
|
i32 replVal = q_N(repl) || eqStr(repl,U"none")? 0 : eqStr(repl,U"strict")? 1 : eqStr(repl,U"loose")? 2 : 3;
|
||||||
if (replVal==3) thrM("•ReBQN: Invalid repl value");
|
if (replVal==3) thrM("•ReBQN: Invalid repl value");
|
||||||
Block* initBlock = bqn_comp(m_str8l("\"(REPL initializer)\""), inc(cdPath), m_f64(0));
|
Block* initBlock = bqn_comp(m_str8l("\"(REPL initializer)\""), inc(cdPath), m_f64(0));
|
||||||
@ -541,6 +540,7 @@ B reBQN_c1(B t, B x) {
|
|||||||
ptr_dec(initBlock);
|
ptr_dec(initBlock);
|
||||||
B dat = m_hVec4(m_f64(replVal), scVal, bi_N, bi_N);
|
B dat = m_hVec4(m_f64(replVal), scVal, bi_N, bi_N);
|
||||||
init_comp(harr_ptr(dat)+2, prim);
|
init_comp(harr_ptr(dat)+2, prim);
|
||||||
|
dec(x);
|
||||||
return m_nfn(reBQNDesc, dat);
|
return m_nfn(reBQNDesc, dat);
|
||||||
}
|
}
|
||||||
B repl_c2(B t, B w, B x) {
|
B repl_c2(B t, B w, B x) {
|
||||||
|
|||||||
40
src/load.c
40
src/load.c
@ -211,7 +211,39 @@ void init_comp(B* set, B prim) { // doesn't consume
|
|||||||
set[0] = inc(load_comp);
|
set[0] = inc(load_comp);
|
||||||
set[1] = inc(load_rtObj);
|
set[1] = inc(load_rtObj);
|
||||||
} else {
|
} else {
|
||||||
thrM("•ReBQN: primitives⇐ unimplemented");
|
if (!isArr(prim)||rnk(prim)!=1) thrM("•ReBQN: 𝕩.primitives must be a list");
|
||||||
|
usz pia = a(prim)->ia;
|
||||||
|
usz np[3] = {0}; // number of functions, 1-modifiers, and 2-modifiers
|
||||||
|
SGetU(prim);
|
||||||
|
for (usz i = 0; i < pia; i++) { // check and count
|
||||||
|
B p = GetU(prim, i);
|
||||||
|
if (!isArr(p)||rnk(p)!=1||a(p)->ia!=2) thrM("•ReBQN: 𝕩.primitives must consist of glyph-primitive pairs");
|
||||||
|
if (!isC32(IGet(p, 0))) thrM("•ReBQN 𝕩.primitives: Glyphs must be characters");
|
||||||
|
B v = IGetU(p, 1);
|
||||||
|
i32 t = isFun(v) ? 0 : isMd1(v) ? 1 : isMd2(v) ? 2 : 3;
|
||||||
|
if (t==3) thrM("•ReBQN 𝕩.primitives: Primitives must be operations");
|
||||||
|
np[t] += 1;
|
||||||
|
}
|
||||||
|
HArr_p r = m_harrUv(3);
|
||||||
|
u32* gl[3];
|
||||||
|
usz sum = 0;
|
||||||
|
for (usz i = 0; i < 3; i++) {
|
||||||
|
usz l = np[i];
|
||||||
|
r.a[i] = m_c32arrv(gl+i, l);
|
||||||
|
np[i] = sum;
|
||||||
|
sum += l;
|
||||||
|
}
|
||||||
|
HArr_p prh = m_harrUv(pia);
|
||||||
|
B *rt = prh.a;
|
||||||
|
for (usz i = 0; i < pia; i++) {
|
||||||
|
B gv = GetU(prim, i);
|
||||||
|
B v = IGet(gv, 1);
|
||||||
|
i32 t = isFun(v) ? 0 : isMd1(v) ? 1 : isMd2(v) ? 2 : 3;
|
||||||
|
*(gl[t]++) = o2cu(IGet(gv, 0));
|
||||||
|
rt[np[t]++] = v;
|
||||||
|
}
|
||||||
|
set[1] = prh.b;
|
||||||
|
set[0] = c1(load_compgen, r.b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,7 +254,7 @@ B bqn_exec(B str, B path, B args) { // consumes all
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
B rebqn_exec(B str, B path, B args, B comp, B rt) { // consumes str,path,args
|
B rebqn_exec(B str, B path, B args, B comp, B rt) { // consumes str,path,args
|
||||||
B rtsys = m_hVec2(rt, incG(bi_sys));
|
B rtsys = m_hVec2(inc(rt), incG(bi_sys));
|
||||||
Block* block = bqn_compc(str, path, args, comp, rtsys);
|
Block* block = bqn_compc(str, path, args, comp, rtsys);
|
||||||
dec(rtsys);
|
dec(rtsys);
|
||||||
B res = m_funBlock(block, 0);
|
B res = m_funBlock(block, 0);
|
||||||
@ -383,8 +415,8 @@ void load_init() { // very last init function
|
|||||||
);
|
);
|
||||||
runtime[n_asrt] = prevAsrt;
|
runtime[n_asrt] = prevAsrt;
|
||||||
B glyphs = m_hVec3(m_str32(U"+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!"), m_str32(U"˙˜˘¨⌜⁼´˝`"), m_str32(U"∘○⊸⟜⌾⊘◶⎉⚇⍟⎊"));
|
B glyphs = m_hVec3(m_str32(U"+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!"), m_str32(U"˙˜˘¨⌜⁼´˝`"), m_str32(U"∘○⊸⟜⌾⊘◶⎉⚇⍟⎊"));
|
||||||
load_compgen = m_funBlock(comp_b, 0);
|
load_compgen = m_funBlock(comp_b, 0); ptr_dec(comp_b);
|
||||||
load_comp = c1(load_compgen, glyphs); ptr_dec(comp_b);
|
load_comp = c1(load_compgen, glyphs);
|
||||||
gc_add(load_compgen); gc_add(load_comp);
|
gc_add(load_compgen); gc_add(load_comp);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user