diff --git a/src/fns.c b/src/fns.c index f3b7560c..98869dfb 100644 --- a/src/fns.c +++ b/src/fns.c @@ -169,6 +169,42 @@ B fne_c2(B t, B w, B x) { } +B rt_indexOf; +B indexOf_c1(B t, B x) { + if (isAtm(x)) thrM("⊐: 𝕩 cannot have rank 0"); + usz xia = a(x)->ia; + if (xia==0) { dec(x); return inc(bi_emptyIVec); } + if (rnk(x)==1 && TI(x).elType==el_i32) { + i32* xp = i32any_ptr(x); + i32 min=I32_MAX, max=I32_MIN; + for (usz i = 0; i < xia; i++) { + i32 c = xp[i]; + if (cmax) max = c; + } + i32 dst = 1 + max-(i64)min; + if ((dstc2=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); } @@ -177,7 +213,7 @@ B fne_c2(B t, B w, B x) { #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) +#define F(A,M,D) A(ud) A(fne) A(feq) A(ltack) A(rtack) M(fmtF) A(indexOf) BI_FNS0(F); static inline void fns_init() { BI_FNS1(F) ti[t_funBI].print = print_funBI; diff --git a/src/h.h b/src/h.h index 86c6fbf2..e96e8c5b 100644 --- a/src/h.h +++ b/src/h.h @@ -124,7 +124,7 @@ char* format_type(u8 u) { #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(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") \ + /*fns.c*/ F(ud,"↕") F(fne,"β‰’") F(feq,"≑") F(ltack,"⊣") F(rtack,"⊒") F(fmtF,"β€’FmtF") F(indexOf,"⊐") \ /*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,"⍋") \ diff --git a/src/load.c b/src/load.c index c0613d84..6056d419 100644 --- a/src/load.c +++ b/src/load.c @@ -62,19 +62,19 @@ static inline void load_init() { comp_currArgs = bi_N; gc_addFn(load_gcFn); B fruntime[] = { - /* +-Γ—Γ·β‹†βˆšβŒŠβŒˆ|Β¬ */ 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_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_N , bi_select, bi_pick , bi_N , bi_N , bi_N, - /* β·βŠ”!Λ™ΛœΛ˜Β¨βŒœβΌΒ΄ */ bi_N , bi_group , bi_asrt , bi_const , bi_swap , bi_N , 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_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_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_N , bi_select, bi_pick , bi_indexOf, bi_N , bi_N, + /* β·βŠ”!Λ™ΛœΛ˜Β¨βŒœβΌΒ΄ */ bi_N , bi_group , bi_asrt , bi_const , bi_swap , bi_N , 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_repeat, bi_catch }; bool rtComplete[] = { /* +-Γ—Γ·β‹†βˆšβŒŠβŒˆ|Β¬ */ 1,1,1,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,0,1,1,0,1,1,0,0,0, + /* βŒ½β‰/β‹β’βŠβŠ‘βŠβŠ’βˆŠ */ 1,0,1,1,0,1,1,1,0,0, /* β·βŠ”!Λ™ΛœΛ˜Β¨βŒœβΌΒ΄ */ 0,1,1,1,1,0,1,1,0,1, /* ˝`βˆ˜β—‹βŠΈβŸœβŒΎβŠ˜β—ΆβŽ‰ */ 0,1,1,1,1,1,1,1,0,0, /* βš‡βŸβŽŠ */ 0,1,1 @@ -127,6 +127,7 @@ static inline void load_init() { rt_group = rtObjGet(rtObjRaw, 41); gc_add(rt_group); rt_under = rtObjGet(rtObjRaw, 56); gc_add(rt_under); rt_reverse = rtObjGet(rtObjRaw, 30); gc_add(rt_reverse); + rt_indexOf = rtObjGet(rtObjRaw, 37); gc_add(rt_indexOf); for (usz i = 0; i < runtimeLen; i++) { #ifdef ALL_R1