native ⊒arr

This commit is contained in:
dzaima 2021-05-23 01:04:54 +03:00
parent 86972e1bac
commit f26cd2a03b
3 changed files with 25 additions and 4 deletions

View File

@ -342,6 +342,26 @@ B find_c2(B t, B w, B x) {
return c2(rt_find, w, x); return c2(rt_find, w, x);
} }
B rt_count;
B count_c1(B t, B x) {
if (isAtm(x) || rnk(x)==0) thrM("⊒: Argument cannot have rank 0");
if (rnk(x)>1) x = toCells(x);
usz xia = a(x)->ia;
i32* rp; B r = m_i32arrv(&rp, xia);
H_b2i* map = m_b2i(64);
BS2B xgetU = TI(x).getU;
for (usz i = 0; i < xia; i++) {
bool had; u64 p = mk_b2i(&map, xgetU(x,i), &had);
rp[i] = had? ++map->a[p].val : (map->a[p].val = 0);
}
dec(x); free_b2i(map);
return r;
}
B count_c2(B t, B w, B x) {
return c2(rt_count, w, x);
}
#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_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_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); }
@ -351,7 +371,7 @@ B find_c2(B t, B w, B x) {
#define BI_FNS1(F) F(BI_A,BI_M,BI_D) #define BI_FNS1(F) F(BI_A,BI_M,BI_D)
#define F(A,M,D) A(ud) A(fne) A(feq) A(ltack) A(rtack) M(fmtF) A(indexOf) A(memberOf) A(find) #define F(A,M,D) A(ud) A(fne) A(feq) A(ltack) A(rtack) M(fmtF) A(indexOf) A(memberOf) A(find) A(count)
BI_FNS0(F); BI_FNS0(F);
static inline void fns_init() { BI_FNS1(F) static inline void fns_init() { BI_FNS1(F)
ti[t_funBI].print = print_funBI; ti[t_funBI].print = print_funBI;

View File

@ -125,7 +125,7 @@ char* format_type(u8 u) {
#define FOR_PF(F) F(none, "(unknown fn)") \ #define FOR_PF(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(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,"⋆⁼") \ /*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,"") \ /*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,"") \ /*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)") \ /*derv.c*/ F(fork,"(fork)") F(atop,"(atop)") F(md1d,"(derived 1-modifier)") F(md2d,"(derived 2-modifier)") \
/*sort.c*/ F(gradeUp,"") F(gradeDown,"") \ /*sort.c*/ F(gradeUp,"") F(gradeDown,"") \

View File

@ -65,7 +65,7 @@ static inline void load_init() {
/* +-×÷⋆√⌊⌈|¬ */ bi_add , bi_sub , bi_mul , bi_div , bi_pow , bi_N , bi_floor, bi_ceil , bi_stile , bi_not, /* +-×÷⋆√⌊⌈|¬ */ bi_add , bi_sub , bi_mul , bi_div , bi_pow , bi_N , bi_floor, bi_ceil , bi_stile , bi_not,
/* ∧∨<>≠=≤≥≡≢ */ bi_and , bi_or , bi_lt , bi_gt , bi_ne , bi_eq , bi_le , bi_ge , bi_feq , bi_fne, /* ∧∨<>≠=≤≥≡≢ */ bi_and , bi_or , bi_lt , bi_gt , bi_ne , bi_eq , bi_le , bi_ge , bi_feq , bi_fne,
/* ⊣⊢⥊∾≍↑↓↕«» */ bi_ltack , bi_rtack , bi_shape, bi_join , bi_couple , bi_take , bi_drop , bi_ud , bi_shifta, bi_shiftb, /* ⊣⊢⥊∾≍↑↓↕«» */ bi_ltack , bi_rtack , bi_shape, bi_join , bi_couple , bi_take , bi_drop , bi_ud , bi_shifta, bi_shiftb,
/* ⌽⍉/⍋⍒⊏⊑⊐⊒∊ */ bi_reverse, bi_N , bi_slash, bi_gradeUp, bi_gradeDown, bi_select, bi_pick , bi_indexOf, bi_N , bi_memberOf, /* ⌽⍉/⍋⍒⊏⊑⊐⊒∊ */ bi_reverse, bi_N , bi_slash, bi_gradeUp, bi_gradeDown, bi_select, bi_pick , bi_indexOf, bi_count , bi_memberOf,
/* ⍷⊔!˙˜˘¨⌜⁼´ */ bi_find , bi_group , bi_asrt , bi_const , bi_swap , bi_cell , bi_each , bi_tbl , bi_N , bi_fold, /* ⍷⊔!˙˜˘¨⌜⁼´ */ bi_find , bi_group , bi_asrt , bi_const , bi_swap , bi_cell , bi_each , bi_tbl , bi_N , bi_fold,
/* ˝`∘○⊸⟜⌾⊘◶⎉ */ bi_N , bi_scan , bi_atop , bi_over , bi_before , bi_after , bi_under, bi_val , bi_cond , bi_N, /* ˝`∘○⊸⟜⌾⊘◶⎉ */ bi_N , bi_scan , bi_atop , bi_over , bi_before , bi_after , bi_under, bi_val , bi_cond , bi_N,
/* ⚇⍟⎊ */ bi_N , bi_repeat, bi_catch /* ⚇⍟⎊ */ bi_N , bi_repeat, bi_catch
@ -74,7 +74,7 @@ static inline void load_init() {
/* +-×÷⋆√⌊⌈|¬ */ 1,1,1,1,1,0,1,1,1,1, /* +-×÷⋆√⌊⌈|¬ */ 1,1,1,1,1,0,1,1,1,1,
/* ∧∨<>≠=≤≥≡≢ */ 1,1,1,1,1,1,1,1,1,1, /* ∧∨<>≠=≤≥≡≢ */ 1,1,1,1,1,1,1,1,1,1,
/* ⊣⊢⥊∾≍↑↓↕«» */ 1,1,0,1,1,1,1,1,1,1, /* ⊣⊢⥊∾≍↑↓↕«» */ 1,1,0,1,1,1,1,1,1,1,
/* ⌽⍉/⍋⍒⊏⊑⊐⊒∊ */ 1,0,1,1,1,1,1,1,0,1, /* ⌽⍉/⍋⍒⊏⊑⊐⊒∊ */ 1,0,1,1,1,1,1,1,1,1,
/* ⍷⊔!˙˜˘¨⌜⁼´ */ 1,1,1,1,1,1,1,1,0,1, /* ⍷⊔!˙˜˘¨⌜⁼´ */ 1,1,1,1,1,1,1,1,0,1,
/* ˝`∘○⊸⟜⌾⊘◶⎉ */ 0,1,1,1,1,1,1,1,0,0, /* ˝`∘○⊸⟜⌾⊘◶⎉ */ 0,1,1,1,1,1,1,1,0,0,
/* ⚇⍟⎊ */ 0,1,1 /* ⚇⍟⎊ */ 0,1,1
@ -127,6 +127,7 @@ static inline void load_init() {
rt_under = rtObjGet(rtObjRaw, 56); gc_add(rt_under); rt_under = rtObjGet(rtObjRaw, 56); gc_add(rt_under);
rt_reverse = rtObjGet(rtObjRaw, 30); gc_add(rt_reverse); rt_reverse = rtObjGet(rtObjRaw, 30); gc_add(rt_reverse);
rt_indexOf = rtObjGet(rtObjRaw, 37); gc_add(rt_indexOf); rt_indexOf = rtObjGet(rtObjRaw, 37); gc_add(rt_indexOf);
rt_count = rtObjGet(rtObjRaw, 38); gc_add(rt_count);
rt_memberOf= rtObjGet(rtObjRaw, 39); gc_add(rt_memberOf); rt_memberOf= rtObjGet(rtObjRaw, 39); gc_add(rt_memberOf);
rt_find = rtObjGet(rtObjRaw, 40); gc_add(rt_find); rt_find = rtObjGet(rtObjRaw, 40); gc_add(rt_find);
rt_cell = rtObjGet(rtObjRaw, 45); gc_add(rt_cell); rt_cell = rtObjGet(rtObjRaw, 45); gc_add(rt_cell);