diff --git a/src/builtins/arithm.c b/src/builtins/arithm.c index 1d2bcaad..002a88b1 100644 --- a/src/builtins/arithm.c +++ b/src/builtins/arithm.c @@ -1,5 +1,6 @@ #include "../core.h" #include "../utils/each.h" +#include "../utils/builtins.h" #include static inline B arith_recm(BB2B f, B x) { diff --git a/src/builtins/internal.c b/src/builtins/internal.c index e1295860..31e031a6 100644 --- a/src/builtins/internal.c +++ b/src/builtins/internal.c @@ -1,5 +1,6 @@ #include "../core.h" #include "../utils/mut.h" +#include "../utils/builtins.h" B itype_c1(B t, B x) { B r; diff --git a/src/builtins/md1.c b/src/builtins/md1.c index d8653270..a7375fef 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -1,6 +1,7 @@ #include "../core.h" #include "../utils/each.h" #include "../utils/file.h" +#include "../utils/builtins.h" diff --git a/src/builtins/md2.c b/src/builtins/md2.c index 46757f89..328be309 100644 --- a/src/builtins/md2.c +++ b/src/builtins/md2.c @@ -1,4 +1,5 @@ #include "../core.h" +#include "../utils/builtins.h" 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); } diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 4f24bbf6..675571d9 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -1,6 +1,7 @@ #include "../core.h" #include "../utils/each.h" #include "../utils/mut.h" +#include "../utils/builtins.h" B shape_c1(B t, B x) { diff --git a/src/builtins/sysfn.c b/src/builtins/sysfn.c index fbb308e0..633c386d 100644 --- a/src/builtins/sysfn.c +++ b/src/builtins/sysfn.c @@ -2,6 +2,7 @@ #include "../utils/hash.h" #include "../utils/file.h" #include "../utils/wyhash.h" +#include "../utils/builtins.h" #include "../ns.h" #include "../nfns.h" diff --git a/src/core/stuff.c b/src/core/stuff.c index 4ee3e63d..2246f222 100644 --- a/src/core/stuff.c +++ b/src/core/stuff.c @@ -4,31 +4,6 @@ u64 allocB; // currently allocated number of bytes B bi_emptyHVec, bi_emptyIVec, bi_emptyCVec, bi_emptySVec; -#define F(N) u64 N; -CTR_FOR(F) -#undef F - -char* format_pf(u8 u) { - switch(u) { default: return "(unknown function)"; - #define F(N,X) case pf_##N: return X; - FOR_PFN(F,F,F) - #undef F - } -} -char* format_pm1(u8 u) { - switch(u) { default: return"(unknown 1-modifier)"; - #define F(N,X) case pm1_##N: return X; - FOR_PM1(F,F,F) - #undef F - } -} -char* format_pm2(u8 u) { - switch(u) { default: return"(unknown 2-modifier)"; - #define F(N,X) case pm2_##N: return X; - FOR_PM2(F,F,F) - #undef F - } -} NOINLINE void arr_print(B x) { // should accept refc=0 arguments for debugging purposes ur r = rnk(x); diff --git a/src/h.h b/src/h.h index c89f315d..8097ba6e 100644 --- a/src/h.h +++ b/src/h.h @@ -154,49 +154,6 @@ enum ElType { // a⌈b shall return the type that can store both, if possible; a char* format_type(u8 u); -#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") A(fill,"•FillFn") M(sys,"•getsys") A(grLen,"•GroupLen") D(grOrd,"•groupOrd") \ -/* sysfn.c*/M(repr,"•Repr") A(asrt,"!") M(out,"•Out") M(show,"•Show") M(bqn,"•BQN") D(cmp,"•Cmp") A(hash,"•Hash") M(makeRand,"•MakeRand") M(exit,"•Exit") \ -/*internal.c*/M(itype,"•internal.Type") M(refc,"•internal.Refc") M(squeeze,"•internal.Squeeze") M(isPure,"•internal.IsPure") A(info,"•internal.Info") \ -/*internal.c*/D(variation,"•internal.Variation") A(listVariations,"•internal.ListVariations") M(clearRefs,"•internal.ClearRefs") M(unshare,"•internal.Unshare") - -#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") \ - -#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 { pf_none, - #define F(N,X) pf_##N, - FOR_PFN(F,F,F) - #undef F -}; -enum PrimMd1 { pm1_none, - #define F(N,X) pm1_##N, - FOR_PM1(F,F,F) - #undef F -}; -enum PrimMd2 { pm2_none, - #define F(N,X) pm2_##N, - FOR_PM2(F,F,F) - #undef F -}; - - -#define F(N,X) extern B bi_##N; -FOR_PFN(F,F,F) -FOR_PM1(F,F,F) -FOR_PM2(F,F,F) -#undef F - - typedef struct Value { i32 refc; // plain old reference count diff --git a/src/load.c b/src/load.c index 6a652ab3..63053a87 100644 --- a/src/load.c +++ b/src/load.c @@ -3,10 +3,13 @@ #include "ns.h" #include "utils/mut.h" #include "utils/file.h" +#include "utils/builtins.h" u64 mm_heapMax = HEAP_MAX; u64 mm_heapAlloc; + + #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); @@ -17,6 +20,33 @@ FOR_PM2(FA,FM,FD) #undef FM #undef FD +#define F(N) u64 N; +CTR_FOR(F) +#undef F +char* format_pf(u8 u) { + switch(u) { default: return "(unknown function)"; + #define F(N,X) case pf_##N: return X; + FOR_PFN(F,F,F) + #undef F + } +} +char* format_pm1(u8 u) { + switch(u) { default: return"(unknown 1-modifier)"; + #define F(N,X) case pm1_##N: return X; + FOR_PM1(F,F,F) + #undef F + } +} +char* format_pm2(u8 u) { + switch(u) { default: return"(unknown 2-modifier)"; + #define F(N,X) case pm2_##N: return X; + FOR_PM2(F,F,F) + #undef F + } +} + + + TypeInfo ti[t_COUNT]; B r1Objs[rtLen]; diff --git a/src/utils/builtins.h b/src/utils/builtins.h new file mode 100644 index 00000000..fe25e7af --- /dev/null +++ b/src/utils/builtins.h @@ -0,0 +1,43 @@ +#pragma once + +#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") A(fill,"•FillFn") M(sys,"•getsys") A(grLen,"•GroupLen") D(grOrd,"•groupOrd") \ +/* sysfn.c*/M(repr,"•Repr") A(asrt,"!") M(out,"•Out") M(show,"•Show") M(bqn,"•BQN") D(cmp,"•Cmp") A(hash,"•Hash") M(makeRand,"•MakeRand") M(exit,"•Exit") \ +/*internal.c*/M(itype,"•internal.Type") M(refc,"•internal.Refc") M(squeeze,"•internal.Squeeze") M(isPure,"•internal.IsPure") A(info,"•internal.Info") \ +/*internal.c*/D(variation,"•internal.Variation") A(listVariations,"•internal.ListVariations") M(clearRefs,"•internal.ClearRefs") M(unshare,"•internal.Unshare") + +#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") + +#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 { pf_none, + #define F(N,X) pf_##N, + FOR_PFN(F,F,F) + #undef F +}; +enum PrimMd1 { pm1_none, + #define F(N,X) pm1_##N, + FOR_PM1(F,F,F) + #undef F +}; +enum PrimMd2 { pm2_none, + #define F(N,X) pm2_##N, + FOR_PM2(F,F,F) + #undef F +}; + + +#define F(N,X) extern B bi_##N; +FOR_PFN(F,F,F) +FOR_PM1(F,F,F) +FOR_PM2(F,F,F) +#undef F