From 89e8cf5a6c2cf1432884670e3e7df9e56bf05ec5 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Thu, 16 Dec 2021 14:27:20 -0500 Subject: [PATCH] =?UTF-8?q?Implement=20=E2=80=A2ReBQN=20=F0=9D=95=A9.primi?= =?UTF-8?q?tive=20processing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/sysfn.c | 2 +- src/load.c | 40 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/builtins/sysfn.c b/src/builtins/sysfn.c index 30f21cbc..d3faf5cf 100644 --- a/src/builtins/sysfn.c +++ b/src/builtins/sysfn.c @@ -527,7 +527,6 @@ B reBQN_c1(B t, B x) { if (!isNsp(x)) thrM("•ReBQN: Argument must be a namespace"); B repl = ns_getNUf(x, m_str8l("repl")); 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; if (replVal==3) thrM("•ReBQN: Invalid repl value"); 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); B dat = m_hVec4(m_f64(replVal), scVal, bi_N, bi_N); init_comp(harr_ptr(dat)+2, prim); + dec(x); return m_nfn(reBQNDesc, dat); } B repl_c2(B t, B w, B x) { diff --git a/src/load.c b/src/load.c index da7b269c..0bc31e19 100644 --- a/src/load.c +++ b/src/load.c @@ -211,7 +211,39 @@ void init_comp(B* set, B prim) { // doesn't consume set[0] = inc(load_comp); set[1] = inc(load_rtObj); } 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; } 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); dec(rtsys); B res = m_funBlock(block, 0); @@ -383,8 +415,8 @@ void load_init() { // very last init function ); runtime[n_asrt] = prevAsrt; B glyphs = m_hVec3(m_str32(U"+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!"), m_str32(U"˙˜˘¨⌜⁼´˝`"), m_str32(U"∘○⊸⟜⌾⊘◶⎉⚇⍟⎊")); - load_compgen = m_funBlock(comp_b, 0); - load_comp = c1(load_compgen, glyphs); ptr_dec(comp_b); + load_compgen = m_funBlock(comp_b, 0); ptr_dec(comp_b); + load_comp = c1(load_compgen, glyphs); gc_add(load_compgen); gc_add(load_comp);