name re parts

This commit is contained in:
dzaima 2023-11-25 22:47:11 +02:00
parent 7fb8ecfa86
commit 7e0204083e
3 changed files with 38 additions and 27 deletions

View File

@ -686,10 +686,10 @@ B reBQN_c1(B t, B x) {
scVal = tag(sc,OBJ_TAG); scVal = tag(sc,OBJ_TAG);
} }
ptr_dec(initBlock); ptr_dec(initBlock);
HArr_p d = m_harrUv(7); d.a[0] = m_f64(replVal); d.a[1] = scVal; HArr_p d = m_harr0v(re_max);
for (usz i=2; i<7; i++) d.a[i] = bi_N; d.a[re_mode] = m_i32(replVal);
NOGC_E; d.a[re_scope] = scVal;
init_comp(d.a+2, prim, sys); init_comp(d.a, prim, sys);
decG(x); decG(x);
return m_nfn(reBQNDesc, d.b); return m_nfn(reBQNDesc, d.b);
} }

View File

@ -240,9 +240,9 @@ B bqn_exec(B str, B path, B args) { // consumes all
B str_all, str_none; B str_all, str_none;
void init_comp(B* set, B prim, B sys) { void init_comp(B* set, B prim, B sys) {
if (q_N(prim)) { if (q_N(prim)) {
set[0] = inc(def_comp); set[re_comp] = inc(def_comp);
set[1] = inc(def_rt); set[re_rt] = inc(def_rt);
set[2] = inc(def_glyphs); set[re_glyphs] = inc(def_glyphs);
} else { } else {
if (!isArr(prim) || RNK(prim)!=1) thrM("•ReBQN: 𝕩.primitives must be a list"); if (!isArr(prim) || RNK(prim)!=1) thrM("•ReBQN: 𝕩.primitives must be a list");
usz pia = IA(prim); usz pia = IA(prim);
@ -278,20 +278,21 @@ void init_comp(B* set, B prim, B sys) {
prh.a[np[t]++] = v; prh.a[np[t]++] = v;
} }
set[1] = prh.b; set[re_rt] = prh.b;
set[2] = inc(rb); set[re_glyphs] = inc(rb);
set[0] = c1(load_compgen, rb); set[re_comp] = c1(load_compgen, rb);
} }
if (q_N(sys)) { if (q_N(sys)) {
all_sys: all_sys:
set[3] = inc(def_sysNames); set[re_sysNames] = inc(def_sysNames);
set[4] = inc(def_sysVals); set[re_sysVals] = inc(def_sysVals);
} else { } else {
if (!isArr(sys) || RNK(sys)!=1) thrM("•ReBQN: 𝕩.system must be a list"); if (!isArr(sys) || RNK(sys)!=1) thrM("•ReBQN: 𝕩.system must be a list");
if (str_all.u==0) { gc_add(str_all = m_c8vec("all",3)); gc_add(str_none = m_c8vec("none",4)); } if (str_all.u==0) { gc_add(str_all = m_c8vec("all",3)); gc_add(str_none = m_c8vec("none",4)); }
if (equal(sys, str_all)) goto all_sys; if (equal(sys, str_all)) goto all_sys;
if (equal(sys, str_none)) { if (equal(sys, str_none)) {
set[3] = set[4] = emptyHVec(); set[re_sysNames] = set[re_sysVals] = emptyHVec();
} else { } else {
usz ia = IA(sys); SGetU(sys) usz ia = IA(sys); SGetU(sys)
M_HARR(r1, ia); M_HARR(r1, ia);
@ -303,15 +304,15 @@ void init_comp(B* set, B prim, B sys) {
HARR_ADD(r1, i, Get(c,0)); HARR_ADD(r1, i, Get(c,0));
HARR_ADD(r2, i, Get(c,1)); HARR_ADD(r2, i, Get(c,1));
} }
set[3] = HARR_FV(r1); set[re_sysNames] = HARR_FV(r1);
set[4] = HARR_FV(r2); set[re_sysVals] = HARR_FV(r2);
} }
} }
} }
B comps_getPrimitives(void) { B comps_getPrimitives(void) {
B* o = harr_ptr(COMPS_CREF(re)); B* o = harr_ptr(COMPS_CREF(re));
B r = o[3]; B r = o[re_rt];
B g = o[4]; B g = o[re_glyphs];
B* pr = harr_ptr(r); B* pr = harr_ptr(r);
B* gg = harr_ptr(g); B* gg = harr_ptr(g);
M_HARR(ph, IA(r)); M_HARR(ph, IA(r));
@ -328,24 +329,24 @@ B comps_getPrimitives(void) {
void comps_getSysvals(B* res) { void comps_getSysvals(B* res) {
B* o = harr_ptr(COMPS_CREF(re)); B* o = harr_ptr(COMPS_CREF(re));
res[0] = o[5]; res[0] = o[re_sysNames];
res[1] = o[6]; res[1] = o[re_sysVals];
} }
B rebqn_exec(B str, B path, B args, B re) { B rebqn_exec(B str, B path, B args, B re) {
B* op = harr_ptr(re); B* op = harr_ptr(re);
i32 replMode = o2iG(op[0]); i32 replMode = o2iG(op[re_mode]);
Scope* sc = c(Scope, op[1]); Scope* sc = c(Scope, op[re_scope]);
B res; B res;
Block* block; Block* block;
if (replMode>0) { if (replMode>0) {
block = bqn_compScc(str, path, args, re, op[2], op[3], sc, replMode==2, true); block = bqn_compScc(str, path, args, re, op[re_comp], op[re_rt], sc, replMode==2, true);
ptr_dec(sc->body); ptr_dec(sc->body);
sc->body = ptr_inc(block->bodies[0]); sc->body = ptr_inc(block->bodies[0]);
res = execBlockInplace(block, sc); res = execBlockInplace(block, sc);
} else { } else {
B rtsys = m_hvec2(inc(op[3]), incG(bi_sys)); B rtsys = m_hvec2(inc(op[re_rt]), incG(bi_sys));
block = bqn_compc(str, path, args, re, op[2], rtsys); block = bqn_compc(str, path, args, re, op[re_comp], rtsys);
decG(rtsys); decG(rtsys);
res = evalFunBlock(block, 0); res = evalFunBlock(block, 0);
} }
@ -537,8 +538,13 @@ void load_init() { // very last init function
#endif #endif
gc_add(load_compgen); gc_add(def_comp); gc_add(load_compgen); gc_add(def_comp);
#endif #endif
def_re = m_caB(7, (B[]){m_c32('?'), m_c32('?'), m_c32('?'), incG(def_rt), incG(def_glyphs), incG(def_sysNames), incG(def_sysVals)}); HArr_p ps = m_harr0v(re_max);
gc_add(def_re); ps.a[re_comp] = incG(def_comp);
ps.a[re_rt] = incG(def_rt);
ps.a[re_glyphs] = incG(def_glyphs);
ps.a[re_sysNames] = incG(def_sysNames);
ps.a[re_sysVals] = incG(def_sysVals);
gc_add(def_re = ps.b);
#if FORMATTER #if FORMATTER
Block* fmt_b = load_compImport("(formatter)", Block* fmt_b = load_compImport("(formatter)",

View File

@ -4,10 +4,15 @@ enum {
comps_path, comps_path,
comps_args, comps_args,
comps_src, comps_src,
comps_re, // HArr of ⟨REPL mode ⋄ scope ⋄ compiler ⋄ runtime ⋄ glyphs ⋄ sysval names ⋄ sysval values⟩ comps_re, // HArr of re_* values (re_mode & re_scope have unspecified values)
comps_envPos, comps_envPos,
comps_max comps_max
}; };
enum {
re_comp, re_rt, re_glyphs, re_sysNames, re_sysVals, // compiling info
re_mode, re_scope, // only for rebqn_exec
re_max
};
#define COMPS_REF(O,N) O->a[comps_##N] #define COMPS_REF(O,N) O->a[comps_##N]
#define COMPS_CREF(N) COMPS_REF(comps_curr, N) #define COMPS_CREF(N) COMPS_REF(comps_curr, N)