diff --git a/src/builtins/arith.c b/src/builtins/arith.c index ea3769e5..699474d6 100644 --- a/src/builtins/arith.c +++ b/src/builtins/arith.c @@ -44,7 +44,7 @@ static inline B arith_recd(BBB2B f, B w, B x) { dec(x); return r; } - #define ffnx(NAME, EXPR, EXTRA) static B NAME##_c2(B t, B w, B x) { \ + #define ffnx(NAME, EXPR, EXTRA) B NAME##_c2(B t, B w, B x) { \ if (isF64(w) & isF64(x)) return m_f64(EXPR); \ EXTRA \ if (isArr(w)|isArr(x)) { B ow=w; B ox=x; \ @@ -89,7 +89,7 @@ static inline B arith_recd(BBB2B f, B w, B x) { thrM(#NAME ": invalid arithmetic"); \ } #else // if !TYPED_ARITH - #define ffnx(name, expr, extra) static B name##_c2(B t, B w, B x) { \ + #define ffnx(name, expr, extra) B name##_c2(B t, B w, B x) { \ if (isF64(w) & isF64(x)) return m_f64(expr); \ extra \ P2(name) \ @@ -153,8 +153,8 @@ B decp_c1(B t, B x); } \ } -#define CMP(NAME,OP,FC,CF) \ -static B NAME##_c2(B t, B w, B x) { \ +#define CMP(NAME,OP,FC,CF) \ +B NAME##_c2(B t, B w, B x) { \ CMP_IMPL(OP, FC, CF); \ P2(NAME); \ return m_i32(compare(w, x) OP 0); \ @@ -165,14 +165,14 @@ CMP(lt, < , 1, 0) CMP(gt, > , 0, 1) #undef CMP -static B eq_c2(B t, B w, B x) { +B eq_c2(B t, B w, B x) { CMP_IMPL(==, 0, 0); P2(eq); B r = m_i32(atomEqual(w, x)); dec(w); dec(x); return r; } -static B ne_c2(B t, B w, B x) { +B ne_c2(B t, B w, B x) { CMP_IMPL(!=, 1, 1); P2(ne); B r = m_i32(!atomEqual(w, x)); @@ -181,38 +181,38 @@ static B ne_c2(B t, B w, B x) { } extern B rt_merge; -static B gt_c1(B t, B x) { +B gt_c1(B t, B x) { if (isAtm(x)) return x; return bqn_merge(x); } -static B add_c1(B t, B x) { return x; } -static B sub_c1(B t, B x) { if (isF64(x)) return m_f64( -x.f ); P1( sub); thrM("-: Negating non-number"); } -static B not_c1(B t, B x) { if (isF64(x)) return m_f64( 1-x.f ); P1( not); thrM("¬: Argument was not a number"); } -static B mul_c1(B t, B x) { if (isF64(x)) return m_f64(x.f==0?0:x.f>0?1:-1); P1(mul); thrM("×: Getting sign of non-number"); } -static B div_c1(B t, B x) { if (isF64(x)) return m_f64( 1/x.f ); P1( div); thrM("÷: Getting reciprocal of non-number"); } -static B pow_c1(B t, B x) { if (isF64(x)) return m_f64( exp(x.f)); P1( pow); thrM("⋆: Getting exp of non-number"); } -static B floor_c1(B t, B x) { if (isF64(x)) return m_f64(floor(x.f)); P1(floor); thrM("⌊: Argument was not a number"); } -static B ceil_c1(B t, B x) { if (isF64(x)) return m_f64( ceil(x.f)); P1( ceil); thrM("⌈: Argument was not a number"); } -static B stile_c1(B t, B x) { if (isF64(x)) return m_f64( fabs(x.f)); P1(stile); thrM("|: Argument was not a number"); } -static B log_c1(B t, B x) { if (isF64(x)) return m_f64( log(x.f)); P1( log); thrM("⋆⁼: Getting log of non-number"); } +B add_c1(B t, B x) { return x; } +B sub_c1(B t, B x) { if (isF64(x)) return m_f64( -x.f ); P1( sub); thrM("-: Negating non-number"); } +B not_c1(B t, B x) { if (isF64(x)) return m_f64( 1-x.f ); P1( not); thrM("¬: Argument was not a number"); } +B mul_c1(B t, B x) { if (isF64(x)) return m_f64(x.f==0?0:x.f>0?1:-1); P1(mul); thrM("×: Getting sign of non-number"); } +B div_c1(B t, B x) { if (isF64(x)) return m_f64( 1/x.f ); P1( div); thrM("÷: Getting reciprocal of non-number"); } +B pow_c1(B t, B x) { if (isF64(x)) return m_f64( exp(x.f)); P1( pow); thrM("⋆: Getting exp of non-number"); } +B floor_c1(B t, B x) { if (isF64(x)) return m_f64(floor(x.f)); P1(floor); thrM("⌊: Argument was not a number"); } +B ceil_c1(B t, B x) { if (isF64(x)) return m_f64( ceil(x.f)); P1( ceil); thrM("⌈: Argument was not a number"); } +B stile_c1(B t, B x) { if (isF64(x)) return m_f64( fabs(x.f)); P1(stile); thrM("|: Argument was not a number"); } +B log_c1(B t, B x) { if (isF64(x)) return m_f64( log(x.f)); P1( log); thrM("⋆⁼: Getting log of non-number"); } -static B lt_c1(B t, B x) { return m_unit(x); } -static B eq_c1(B t, B x) { B r = m_i32(isArr(x)? rnk(x) : 0); decR(x); return r; } -static B ne_c1(B t, B x) { B r = m_f64(isArr(x)&&rnk(x)? *a(x)->sh : 1); decR(x); return r; } +B lt_c1(B t, B x) { return m_unit(x); } +B eq_c1(B t, B x) { B r = m_i32(isArr(x)? rnk(x) : 0); decR(x); return r; } +B ne_c1(B t, B x) { B r = m_f64(isArr(x)&&rnk(x)? *a(x)->sh : 1); decR(x); return r; } extern B rt_sortDsc; -static B or_c1(B t, B x) { return c1(rt_sortDsc, x); } +B or_c1(B t, B x) { return c1(rt_sortDsc, x); } B and_c1(B t, B x); // defined in sort.c #undef P1 #undef P2 -#define F(A,M,D) A(add) A(sub) A(mul) A(div) A(pow) A(floor) A(ceil) A(stile) A(eq) A(ne) D(le) D(ge) A(lt) A(gt) A(and) A(or) A(not) A(log) -void arith_init() { BI_FNS(F) + + +void arith_init() { c(BFn,bi_add)->ident = c(BFn,bi_sub)->ident = c(BFn,bi_or )->ident = c(BFn,bi_ne)->ident = c(BFn,bi_gt)->ident = m_i32(0); c(BFn,bi_mul)->ident = c(BFn,bi_div)->ident = c(BFn,bi_and)->ident = c(BFn,bi_eq)->ident = c(BFn,bi_ge)->ident = c(BFn,bi_pow)->ident = c(BFn,bi_not)->ident = m_i32(1); c(BFn,bi_floor)->ident = m_f64(1.0/0.0); c(BFn,bi_ceil )->ident = m_f64(-1.0/0.0); } -#undef F diff --git a/src/builtins/fns.c b/src/builtins/fns.c index 9d9ec517..be9d68dd 100644 --- a/src/builtins/fns.c +++ b/src/builtins/fns.c @@ -291,13 +291,9 @@ B count_c2(B t, B w, B x) { - - -#define F(A,M,D) A(ud) A(pair) A(fne) A(feq) A(ltack) A(rtack) M(fmtF) A(indexOf) A(memberOf) A(find) A(count) -void fns_init() { BI_FNS(F) +void fns_init() { ti[t_funBI].print = print_funBI; ti[t_funBI].identity = funBI_identity; ti[t_funBI].fn_uc1 = funBI_uc1; ti[t_funBI].fn_ucw = funBI_ucw; } -#undef F diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 89891020..e3f0429e 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -380,16 +380,9 @@ B cell_c2(B d, B w, B x) { B f = c(Md1D,d)->f; return r; } -#define ba(NAME) bi_##NAME = mm_alloc(sizeof(Md1), t_md1BI, ftag(MD1_TAG)); c(Md1,bi_##NAME)->c2 = NAME##_c2; c(Md1,bi_##NAME)->c1 = NAME##_c1 ; c(Md1,bi_##NAME)->extra=pm1_##NAME; gc_add(bi_##NAME); -#define bd(NAME) bi_##NAME = mm_alloc(sizeof(Md1), t_md1BI, ftag(MD1_TAG)); c(Md1,bi_##NAME)->c2 = NAME##_c2; c(Md1,bi_##NAME)->c1 = c1_invalid; c(Md1,bi_##NAME)->extra=pm1_##NAME; gc_add(bi_##NAME); -#define bm(NAME) bi_##NAME = mm_alloc(sizeof(Md1), t_md1BI, ftag(MD1_TAG)); c(Md1,bi_##NAME)->c2 = c2_invalid;c(Md1,bi_##NAME)->c1 = NAME##_c1 ; c(Md1,bi_##NAME)->extra=pm1_##NAME; gc_add(bi_##NAME); + static void print_md1BI(B x) { printf("%s", format_pm1(c(Md1,x)->extra)); } - -void md1_init() { ba(tbl) ba(each) ba(fold) ba(scan) ba(const) ba(swap) ba(cell) ba(timed) ba(fchars) bm(fbytes) bm(flines) ba(import) +void md1_init() { ti[t_md1BI].print = print_md1BI; } - -#undef ba -#undef bd -#undef bm diff --git a/src/builtins/md2.c b/src/builtins/md2.c index ae0de2d7..5528c8d5 100644 --- a/src/builtins/md2.c +++ b/src/builtins/md2.c @@ -1,12 +1,5 @@ #include "../core.h" -typedef struct BMd2 { - struct Md1; - BBBBB2B uc1; - BBBBBB2B ucw; -} BMd2; - -void print_md2BI(B x) { printf("%s", format_pm2(c(Md1,x)->extra)); } B md2BI_uc1(B t, B o, B f, B g, B x) { return c(BMd2,t)->uc1(t, o, f, g, x); } B md2BI_ucw(B t, B o, B f, B g, B w, B x) { return c(BMd2,t)->ucw(t, o, f, g, w, x); } @@ -156,17 +149,11 @@ B before_uc1(B t, B o, B f, B g, B x) { } -#define ba(N) { B t=bi_##N=mm_alloc(sizeof(BMd2), t_md2BI, ftag(MD2_TAG)); BMd2*m=c(BMd2,t); m->c2 = N##_c2 ; m->c1 = N##_c1; m->extra=pm2_##N; m->uc1=def_m2_uc1; m->ucw=def_m2_ucw; gc_add(t); } -#define bd(N) { B t=bi_##N=mm_alloc(sizeof(BMd2), t_md2BI, ftag(MD2_TAG)); BMd2*m=c(BMd2,t); m->c2 = N##_c2 ; m->c1 = c1_invalid; m->extra=pm2_##N; m->uc1=def_m2_uc1; m->ucw=def_m2_ucw; gc_add(t); } -#define bm(N) { B t=bi_##N=mm_alloc(sizeof(BMd2), t_md2BI, ftag(MD2_TAG)); BMd2*m=c(BMd2,t); m->c2 = c2_invalid; m->c1 = N##_c1; m->extra=pm2_##N; m->uc1=def_m2_uc1; m->ucw=def_m2_ucw; gc_add(t); } -void md2_init() { ba(val) ba(repeat) ba(atop) ba(over) ba(before) ba(after) ba(cond) ba(fillBy) ba(under) ba(catch) +static void print_md2BI(B x) { printf("%s", format_pm2(c(Md1,x)->extra)); } +void md2_init() { ti[t_md2BI].print = print_md2BI; ti[t_md2BI].m2_uc1 = md2BI_uc1; ti[t_md2BI].m2_ucw = md2BI_ucw; c(BMd2,bi_before)->uc1 = before_uc1; } - -#undef ba -#undef bd -#undef bm diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index ac95a0ff..35634b54 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -845,12 +845,10 @@ B select_ucw(B t, B o, B w, B x) { } -#define F(A,M,D) A(shape) A(pick) A(select) A(slash) A(join) A(couple) A(shiftb) A(shifta) A(take) A(drop) A(group) A(reverse) -void sfns_init() { BI_FNS(F) +void sfns_init() { c(BFn,bi_pick)->uc1 = pick_uc1; c(BFn,bi_reverse)->uc1 = reverse_uc1; c(BFn,bi_pick)->ucw = pick_ucw; c(BFn,bi_slash)->ucw = slash_ucw; c(BFn,bi_select)->ucw = select_ucw; } -#undef F diff --git a/src/builtins/sort.c b/src/builtins/sort.c index 63309187..5c382bd1 100644 --- a/src/builtins/sort.c +++ b/src/builtins/sort.c @@ -48,7 +48,3 @@ B and_c1(B t, B x) { dec(x); return withFill(r.b,xf); } - -#define F(A,M,D) A(gradeUp) A(gradeDown) -void sort_init() { BI_FNS(F) } -#undef F diff --git a/src/builtins/sysfn.c b/src/builtins/sysfn.c index ac4b0807..2a9910a3 100644 --- a/src/builtins/sysfn.c +++ b/src/builtins/sysfn.c @@ -190,10 +190,6 @@ B hash_c1(B t, B x) { } -#define F(A,M,D) M(type) M(decp) M(primInd) M(glyph) M(repr) A(fill) A(grLen) D(grOrd) A(asrt) M(out) M(show) M(sys) M(bqn) D(cmp) D(internal) A(hash) -void sysfn_init() { BI_FNS(F) } -#undef F - static B makeRel(B md) { // doesn't consume return m1_d(inc(md), path_dir(inc(comp_currPath))); } diff --git a/src/core.h b/src/core.h index 21992dd8..f45ba616 100644 --- a/src/core.h +++ b/src/core.h @@ -31,10 +31,11 @@ typedef struct BFn { BBB2B uc1; BBBB2B ucw; } BFn; -#define BI_A(N) { B t=bi_##N = mm_alloc(sizeof(BFn), t_funBI, ftag(FUN_TAG)); BFn*f=c(BFn,t); f->c2=N##_c2 ; f->c1=N##_c1 ; f->extra=pf_##N; f->ident=bi_N; f->uc1=def_fn_uc1; f->ucw=def_fn_ucw; gc_add(t); } -#define BI_D(N) { B t=bi_##N = mm_alloc(sizeof(BFn), t_funBI, ftag(FUN_TAG)); BFn*f=c(BFn,t); f->c2=N##_c2 ; f->c1=c1_invalid; f->extra=pf_##N; f->ident=bi_N; f->uc1=def_fn_uc1; f->ucw=def_fn_ucw; gc_add(t); } -#define BI_M(N) { B t=bi_##N = mm_alloc(sizeof(BFn), t_funBI, ftag(FUN_TAG)); BFn*f=c(BFn,t); f->c2=c2_invalid; f->c1=N##_c1 ; f->extra=pf_##N; f->ident=bi_N; f->uc1=def_fn_uc1; f->ucw=def_fn_ucw; gc_add(t); } -#define BI_FNS(F) F(BI_A,BI_M,BI_D) +typedef struct BMd2 { + struct Md1; + BBBBB2B uc1; + BBBBBB2B ucw; +} BMd2; static i64 isum(B x) { // doesn't consume; may error; TODO error on overflow assert(isArr(x)); diff --git a/src/core/derv.h b/src/core/derv.h index 2fab72ee..ea444fd0 100644 --- a/src/core/derv.h +++ b/src/core/derv.h @@ -35,11 +35,11 @@ B fork_c2(B t, B w, B x); B md2H_c1(B d, B x); B md2H_c2(B d, B w, B x); // consume all args -static B m_md1D(B m, B f ) { B r = mm_alloc(sizeof(Md1D), t_md1D, ftag(FUN_TAG)); c(Md1D,r)->f = f; c(Md1D,r)->m1 = m; c(Md1D,r)->c1=md1D_c1; c(Md1D,r)->c2=md1D_c2; c(Md1D,r)->extra=pf_md1d; return r; } -static B m_md2D(B m, B f, B g) { B r = mm_alloc(sizeof(Md2D), t_md2D, ftag(FUN_TAG)); c(Md2D,r)->f = f; c(Md2D,r)->m2 = m; c(Md2D,r)->g = g; c(Md2D,r)->c1=md2D_c1; c(Md2D,r)->c2=md2D_c2; c(Md2D,r)->extra=pf_md2d; return r; } -static B m_md2H(B m, B g) { B r = mm_alloc(sizeof(Md2H), t_md2H, ftag(MD1_TAG)); c(Md2H,r)->m2 = m; c(Md2H,r)->g = g; c(Md2H,r)->c1=md2H_c1; c(Md2H,r)->c2=md2H_c2; return r; } -static B m_fork(B f, B g, B h) { B r = mm_alloc(sizeof(Fork), t_fork, ftag(FUN_TAG)); c(Fork,r)->f = f; c(Fork,r)->g = g; c(Fork,r)->h = h; c(Fork,r)->c1=fork_c1; c(Fork,r)->c2=fork_c2; c(Fork,r)->extra=pf_fork; return r; } -static B m_atop( B g, B h) { B r = mm_alloc(sizeof(Atop), t_atop, ftag(FUN_TAG)); c(Atop,r)->g = g; c(Atop,r)->h = h; c(Atop,r)->c1=tr2D_c1; c(Atop,r)->c2=tr2D_c2; c(Atop,r)->extra=pf_atop; return r; } +static B m_md1D(B m, B f ) { B r = mm_alloc(sizeof(Md1D), t_md1D, ftag(FUN_TAG)); c(Md1D,r)->f = f; c(Md1D,r)->m1 = m; c(Md1D,r)->c1=md1D_c1; c(Md1D,r)->c2=md1D_c2; return r; } +static B m_md2D(B m, B f, B g) { B r = mm_alloc(sizeof(Md2D), t_md2D, ftag(FUN_TAG)); c(Md2D,r)->f = f; c(Md2D,r)->m2 = m; c(Md2D,r)->g = g; c(Md2D,r)->c1=md2D_c1; c(Md2D,r)->c2=md2D_c2; return r; } +static B m_md2H(B m, B g) { B r = mm_alloc(sizeof(Md2H), t_md2H, ftag(MD1_TAG)); c(Md2H,r)->m2 = m; c(Md2H,r)->g = g; c(Md2H,r)->c1=md2H_c1; c(Md2H,r)->c2=md2H_c2; return r; } +static B m_fork(B f, B g, B h) { B r = mm_alloc(sizeof(Fork), t_fork, ftag(FUN_TAG)); c(Fork,r)->f = f; c(Fork,r)->g = g; c(Fork,r)->h = h; c(Fork,r)->c1=fork_c1; c(Fork,r)->c2=fork_c2; return r; } +static B m_atop( B g, B h) { B r = mm_alloc(sizeof(Atop), t_atop, ftag(FUN_TAG)); c(Atop,r)->g = g; c(Atop,r)->h = h; c(Atop,r)->c1=tr2D_c1; c(Atop,r)->c2=tr2D_c2; return r; } // consume all args static B m1_d(B m, B f ) { if(isMd1(m)) return TI(m).m1_d(m, f ); thrM("Interpreting non-1-modifier as 1-modifier"); } diff --git a/src/h.h b/src/h.h index c1e9703c..73fec9de 100644 --- a/src/h.h +++ b/src/h.h @@ -151,70 +151,69 @@ enum ElType { // a⌈b shall return the type that can store both, if possible; a char* format_type(u8 u); -#define FOR_PFN(F) F(none, "(unknown fn)") \ - /*arith.c*/ F(add,"+") F(sub,"-") F(mul,"×") F(div,"÷") F(pow,"⋆") F(floor,"⌊") F(ceil,"⌈") F(stile,"|") F(eq,"=") \ - /*arith.c*/ F(ne,"≠") F(le,"≤") F(ge,"≥") F(lt,"<") F(gt,">") F(and,"∧") F(or,"∨") F(not,"¬") F(log,"⋆⁼") \ - /*fns.c*/ F(ud,"↕") F(fne,"≢") F(feq,"≡") F(ltack,"⊣") F(rtack,"⊢") F(fmtF,"•FmtF") F(indexOf,"⊐") F(memberOf,"∊") F(find,"⍷") F(count,"⊒") \ - /*sfns.c*/ F(shape,"⥊") F(pick,"⊑") F(pair,"{𝕨‿𝕩}") F(select,"⊏") F(slash,"/") F(join,"∾") F(couple,"≍") F(shiftb,"»") F(shifta,"«") F(take,"↑") F(drop,"↓") F(group,"⊔") F(reverse,"⌽") \ - /*derv.c*/ F(fork,"(fork)") F(atop,"(atop)") F(md1d,"(derived 1-modifier)") F(md2d,"(derived 2-modifier)") \ - /*sort.c*/ F(gradeUp,"⍋") F(gradeDown,"⍒") \ - /*sysfn.c*/ F(type,"•Type") F(decp,"•Decompose") F(primInd,"•PrimInd") F(glyph,"•Glyph") F(repr,"•Repr") F(fill,"•FillFn") \ - /*sysfn.c*/ F(grLen,"•GroupLen") F(grOrd,"•groupOrd") F(asrt,"!") F(sys,"•getsys") F(bqn,"•BQN") F(cmp,"•Cmp") F(internal,"•Internal") F(show,"•Show") F(out,"•Out") F(hash,"•Hash") \ +#define FOR_PFN(A,M,D) \ + /*arith.c*/ A(add,"+") A(sub,"-") A(mul,"×") A(div,"÷") A(pow,"⋆") A(floor,"⌊") A(ceil,"⌈") A(stile,"|") A(eq,"=") \ + /*arith.c*/ A(ne,"≠") D(le,"≤") D(ge,"≥") A(lt,"<") A(gt,">") A(and,"∧") A(or,"∨") A(not,"¬") A(log,"⋆⁼") \ + /*fns.c*/ A(ud,"↕") A(fne,"≢") A(feq,"≡") A(ltack,"⊣") A(rtack,"⊢") M(fmtF,"•FmtF") A(indexOf,"⊐") A(memberOf,"∊") A(find,"⍷") A(count,"⊒") \ + /*sfns.c*/ A(shape,"⥊") A(pick,"⊑") A(pair,"{𝕨‿𝕩}") A(select,"⊏") A(slash,"/") A(join,"∾") A(couple,"≍") A(shiftb,"»") A(shifta,"«") A(take,"↑") A(drop,"↓") A(group,"⊔") A(reverse,"⌽") \ + /*sort.c*/ A(gradeUp,"⍋") A(gradeDown,"⍒") \ + /*sysfn.c*/ M(type,"•Type") M(decp,"•Decompose") M(primInd,"•PrimInd") M(glyph,"•Glyph") M(repr,"•Repr") A(fill,"•FillFn") \ + /*sysfn.c*/ A(grLen,"•GroupLen") D(grOrd,"•groupOrd") A(asrt,"!") M(out,"•Out") M(show,"•Show") M(sys,"•getsys") M(bqn,"•BQN") D(cmp,"•Cmp") D(internal,"•Internal") A(hash,"•Hash") \ -#define FOR_PM1(F) F(none, "(unknown 1-modifier)") \ - /*md1.c*/ F(tbl,"⌜") F(each,"¨") F(fold,"´") F(scan,"`") F(const,"˙") F(swap,"˜") F(cell,"˘") \ - /*md1.c*/ F(timed,"•_timed") F(fchars,"•FChars") F(fbytes,"•FBytes") F(flines,"•FLines") F(import,"•Import") +#define FOR_PM1(A,M,D) \ + /*md1.c*/ A(tbl,"⌜") A(each,"¨") A(fold,"´") A(scan,"`") A(const,"˙") A(swap,"˜") A(cell,"˘") \ + /*md1.c*/ A(timed,"•_timed") A(fchars,"•FChars") M(fbytes,"•FBytes") M(flines,"•FLines") A(import,"•Import") -#define FOR_PM2(F) F(none, "(unknown 2-modifier)") \ - /*md2.c*/ F(val,"⊘") F(repeat,"⍟") F(fillBy,"•_fillBy_") F(catch,"⎊") \ - /*md2.c*/ F(atop,"∘") F(over,"○") F(before,"⊸") F(after,"⟜") F(cond,"◶") F(under,"⌾") +#define FOR_PM2(A,M,D) \ + /*md2.c*/ A(val,"⊘") A(repeat,"⍟") A(fillBy,"•_fillBy_") A(catch,"⎊") \ + /*md2.c*/ A(atop,"∘") A(over,"○") A(before,"⊸") A(after,"⟜") A(cond,"◶") A(under,"⌾") -enum PrimFns { +enum PrimFns { pf_none, #define F(N,X) pf_##N, - FOR_PFN(F) + FOR_PFN(F,F,F) #undef F }; -enum PrimMd1 { +enum PrimMd1 { pm1_none, #define F(N,X) pm1_##N, - FOR_PM1(F) + FOR_PM1(F,F,F) #undef F }; -enum PrimMd2 { +enum PrimMd2 { pm2_none, #define F(N,X) pm2_##N, - FOR_PM2(F) + FOR_PM2(F,F,F) #undef F }; static char* format_pf(u8 u) { switch(u) { default: return "(unknown function)"; #define F(N,X) case pf_##N: return X; - FOR_PFN(F) + FOR_PFN(F,F,F) #undef F } } static char* format_pm1(u8 u) { switch(u) { default: return"(unknown 1-modifier)"; #define F(N,X) case pm1_##N: return X; - FOR_PM1(F) + FOR_PM1(F,F,F) #undef F } } static char* format_pm2(u8 u) { switch(u) { default: return"(unknown 2-modifier)"; #define F(N,X) case pm2_##N: return X; - FOR_PM2(F) + FOR_PM2(F,F,F) #undef F } } #define F(N,X) extern B bi_##N; -FOR_PFN(F) +FOR_PFN(F,F,F) #undef F #define F(N,X) extern B bi_##N; -FOR_PM1(F) +FOR_PM1(F,F,F) #undef F #define F(N,X) extern B bi_##N; -FOR_PM2(F) +FOR_PM2(F,F,F) #undef F diff --git a/src/load.c b/src/load.c index e21413cc..76a062c4 100644 --- a/src/load.c +++ b/src/load.c @@ -2,16 +2,16 @@ #include "vm.h" #include "utils/file.h" +#define FA(N,X) B bi_##N; B N##_c1(B t, B x); B N##_c2(B t, B w, B x); +#define FM(N,X) B bi_##N; B N##_c1(B t, B x); +#define FD(N,X) B bi_##N; B N##_c2(B t, B w, B x); +FOR_PFN(FA,FM,FD) +FOR_PM1(FA,FM,FD) +FOR_PM2(FA,FM,FD) +#undef FA +#undef FM +#undef FD -#define F(N,X) B bi_##N; -FOR_PFN(F) -#undef F -#define F(N,X) B bi_##N; -FOR_PM1(F) -#undef F -#define F(N,X) B bi_##N; -FOR_PM2(F) -#undef F TypeInfo ti[t_COUNT]; B r1Objs[rtLen]; @@ -81,7 +81,7 @@ void bqn_setComp(B comp) { // consumes; doesn't unload old comp, but whatever gc_add(load_comp); } -static inline void load_init() { +static inline void load_init() { // very last init function comp_currPath = bi_N; comp_currArgs = bi_N; gc_addFn(load_gcFn); @@ -240,7 +240,7 @@ static B def_m1_d(B m, B f ) { thrM("cannot derive this"); } static B def_m2_d(B m, B f, B g) { thrM("cannot derive this"); } static B def_slice(B x, usz s) { thrM("cannot slice non-array!"); } -static inline void base_init() { +static inline void base_init() { // very first init function for (i32 i = 0; i < t_COUNT; i++) { ti[i].free = def_free; ti[i].visit = def_visit; @@ -275,9 +275,33 @@ static inline void base_init() { bi_optOut = tag(3, TAG_TAG); bi_noFill = tag(5, TAG_TAG); assert((MD1_TAG>>1) == (MD2_TAG>>1)); // just to be sure it isn't changed incorrectly, `isMd` depends on this + + #define FA(N,X) { B t=bi_##N = mm_alloc(sizeof(BFn), t_funBI, ftag(FUN_TAG)); BFn*f=c(BFn,t); f->c2=N##_c2 ; f->c1=N##_c1 ; f->extra=pf_##N; f->ident=bi_N; f->uc1=def_fn_uc1; f->ucw=def_fn_ucw; gc_add(t); } + #define FM(N,X) { B t=bi_##N = mm_alloc(sizeof(BFn), t_funBI, ftag(FUN_TAG)); BFn*f=c(BFn,t); f->c2=c2_invalid; f->c1=N##_c1 ; f->extra=pf_##N; f->ident=bi_N; f->uc1=def_fn_uc1; f->ucw=def_fn_ucw; gc_add(t); } + #define FD(N,X) { B t=bi_##N = mm_alloc(sizeof(BFn), t_funBI, ftag(FUN_TAG)); BFn*f=c(BFn,t); f->c2=N##_c2 ; f->c1=c1_invalid; f->extra=pf_##N; f->ident=bi_N; f->uc1=def_fn_uc1; f->ucw=def_fn_ucw; gc_add(t); } + FOR_PFN(FA,FM,FD) + #undef FA + #undef FM + #undef FD + + #define FA(N,X) { B t = bi_##N = mm_alloc(sizeof(Md1), t_md1BI, ftag(MD1_TAG)); c(Md1,t)->c2 = N##_c2 ; c(Md1,t)->c1 = N##_c1 ; c(Md1,t)->extra=pm1_##N; gc_add(t); } + #define FM(N,X) { B t = bi_##N = mm_alloc(sizeof(Md1), t_md1BI, ftag(MD1_TAG)); c(Md1,t)->c2 = c2_invalid; c(Md1,t)->c1 = N##_c1 ; c(Md1,t)->extra=pm1_##N; gc_add(t); } + #define FD(N,X) { B t = bi_##N = mm_alloc(sizeof(Md1), t_md1BI, ftag(MD1_TAG)); c(Md1,t)->c2 = N##_c2 ; c(Md1,t)->c1 = c1_invalid; c(Md1,t)->extra=pm1_##N; gc_add(t); } + FOR_PM1(FA,FM,FD) + #undef FA + #undef FM + #undef FD + + #define FA(N,X) { B t=bi_##N=mm_alloc(sizeof(BMd2), t_md2BI, ftag(MD2_TAG)); BMd2*m=c(BMd2,t); m->c2 = N##_c2 ; m->c1 = N##_c1; m->extra=pm2_##N; m->uc1=def_m2_uc1; m->ucw=def_m2_ucw; gc_add(t); } + #define FM(N,X) { B t=bi_##N=mm_alloc(sizeof(BMd2), t_md2BI, ftag(MD2_TAG)); BMd2*m=c(BMd2,t); m->c2 = N##_c2 ; m->c1 = c1_invalid; m->extra=pm2_##N; m->uc1=def_m2_uc1; m->ucw=def_m2_ucw; gc_add(t); } + #define FD(N,X) { B t=bi_##N=mm_alloc(sizeof(BMd2), t_md2BI, ftag(MD2_TAG)); BMd2*m=c(BMd2,t); m->c2 = c2_invalid; m->c1 = N##_c1; m->extra=pm2_##N; m->uc1=def_m2_uc1; m->ucw=def_m2_ucw; gc_add(t); } + FOR_PM2(FA,FM,FD) + #undef FA + #undef FM + #undef FD } -#define FOR_INIT(F) F(base) F(harr) F(fillarr) F(i32arr) F(c32arr) F(f64arr) F(hash) F(fns) F(sfns) F(arith) F(sort) F(md1) F(md2) F(sysfn) F(derv) F(comp) F(rtWrap) F(ns) F(load) +#define FOR_INIT(F) F(base) F(harr) F(fillarr) F(i32arr) F(c32arr) F(f64arr) F(hash) F(sfns) F(fns) F(arith) F(md1) F(md2) F(derv) F(comp) F(rtWrap) F(ns) F(load) #define F(X) void X##_init(); FOR_INIT(F) #undef F diff --git a/src/ns.c b/src/ns.c index 0efa7eed..5147e052 100644 --- a/src/ns.c +++ b/src/ns.c @@ -103,6 +103,9 @@ void nsDesc_visit(Value* x) { void nsDesc_print(B x) { printf("(namespace description)"); } + + + void ns_init() { ti[t_ns].free = ns_free; ti[t_nsDesc].free = nsDesc_free; ti[t_ns].visit = ns_visit; ti[t_nsDesc].visit = nsDesc_visit; diff --git a/src/vm.c b/src/vm.c index 802b3f21..ce4ae127 100644 --- a/src/vm.c +++ b/src/vm.c @@ -593,6 +593,15 @@ void allocStack(void** curr, void** start, void** end, i32 elSize, i32 count) { *end = ((char*)*start)+sz; mprotect(*end, pageSize, PROT_NONE); // idk first way i found to force erroring on overflow } +void print_vmStack() { + #ifdef DEBUG_VM + printf("vm stack:"); + for (i32 i = 0; i < (bcDepth>>1) + 1; i++) { printf(" %d", vmStack[i]); fflush(stdout); } + printf("\n"); fflush(stdout); + #endif +} + + void comp_init() { ti[t_comp ].free = comp_free; ti[t_comp ].visit = comp_visit; ti[t_comp ].print = comp_print; @@ -609,13 +618,6 @@ void comp_init() { allocStack((void**)&envCurr, (void**)&envStart, (void**)&envEnd, sizeof(Env), ENV_SIZE); } -void print_vmStack() { - #ifdef DEBUG_VM - printf("vm stack:"); - for (i32 i = 0; i < (bcDepth>>1) + 1; i++) { printf(" %d", vmStack[i]); fflush(stdout); } - printf("\n"); fflush(stdout); - #endif -}