From 6ac8944b06496f5405434b10aa5acb674798db86 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Thu, 18 May 2023 10:32:41 -0400 Subject: [PATCH 01/10] Remove redundant isAtm check in constant case of each_c1 --- src/builtins/md1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index cd3c4fa0..3144d58f 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -44,8 +44,8 @@ B each_c1(Md1D* d, B x) { B f = d->f; if (isAtm(x)) r = m_hunit(c1(f, x)); else if (isFun(f)) r = eachm_fn(f, x, c(Fun,f)->c1); else { - if (isMd(f)) if (isAtm(x) || IA(x)) { decR(x); thrM("Calling a modifier"); } usz ia = IA(x); + if (isMd(f) && ia>0) { decR(x); thrM("Calling a modifier"); } MAKE_MUT(rm, ia); mut_fill(rm, 0, f, ia); r = mut_fcd(rm, x); From 1ff8954dd3d86c1c64d15f4b7589d14a37502c14 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Thu, 18 May 2023 10:33:00 -0400 Subject: [PATCH 02/10] =?UTF-8?q?Fix=20leak=20in=20dyadic=20=E2=80=A2=5Fti?= =?UTF-8?q?med?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/md1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 3144d58f..40fed4b8 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -136,7 +136,7 @@ B swap_c2(Md1D* d, B w, B x) { return c2(d->f, x , w); } B timed_c2(Md1D* d, B w, B x) { B f = d->f; i64 am = o2i64(w); if (am<=0) thrM("•_timed: 𝕨 must be an integer greater than 1"); - incBy(x, am); + incBy(x, am-1); FC1 fc1 = c1fn(f); u64 sns = nsTime(); for (i64 i = 0; i < am; i++) dec(fc1(f, x)); From a8cead1d3d4870c6cebe529207589afc36bae912 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Thu, 18 May 2023 10:36:55 -0400 Subject: [PATCH 03/10] Fast cases for tacks, constant operands, and short arguments in scans --- src/builtins/scan.c | 52 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/src/builtins/scan.c b/src/builtins/scan.c index 832eb8b5..071ed98d 100644 --- a/src/builtins/scan.c +++ b/src/builtins/scan.c @@ -178,14 +178,35 @@ static B scan_plus(f64 r0, B x, u8 xe, usz ia) { #endif } +B fne_c1(B, B); +B shape_c2(B, B, B); + B scan_c1(Md1D* d, B x) { B f = d->f; if (isAtm(x) || RNK(x)==0) thrM("`: Argument cannot have rank 0"); ur xr = RNK(x); usz ia = IA(x); - if (ia==0) return x; + if (*SH(x)<=1 || ia==0) return x; + if (RARE(!isFun(f))) { + if (isMd(f)) thrM("Calling a modifier"); + B xf = getFillR(x); + MAKE_MUT(rm, ia); + usz csz = arr_csz(x); + mut_copy(rm, 0, x, 0, csz); + mut_fill(rm, csz, f, ia-csz); + return withFill(mut_fcd(rm, x), xf); + } u8 xe = TI(x,elType); - if (xr==1 && xe<=el_f64 && isFun(f) && v(f)->flags) { + if (v(f)->flags) { u8 rtid = v(f)->flags-1; + if (rtid==n_rtack) return x; + if (rtid==n_ltack) { + usz csz = arr_csz(x); + B s = C1(fne, incG(x)); + Arr* r = TI(x,slice)(x, 0, csz); + return C2(shape, s, taga(r)); + } + if (!(xr==1 && xe<=el_f64)) goto base; + if (xe==el_bit) { if (rtid==n_add ) return scan_add_bool(x, ia); // + if (rtid==n_or | rtid==n_ceil ) return scan_or(x, ia); // ∨⌈ @@ -237,9 +258,21 @@ B add_c2(B, B, B); B scan_c2(Md1D* d, B w, B x) { B f = d->f; if (isAtm(x) || RNK(x)==0) thrM("`: 𝕩 cannot have rank 0"); ur xr = RNK(x); usz* xsh = SH(x); usz ia = IA(x); + if (isArr(w)? !ptr_eqShape(SH(w), RNK(w), xsh+1, xr-1) : xr!=1) thrF("`: Shape of 𝕨 must match the cell of 𝕩 (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); + if (ia==0) { dec(w); return x; } + if (RARE(!isFun(f))) { + if (isMd(f)) thrM("Calling a modifier"); + B xf = getFillR(x); + MAKE_MUT(rm, ia); + mut_fill(rm, 0, f, ia); + return withFill(mut_fcd(rm, x), xf); + } u8 xe = TI(x,elType); - if (xr==1 && elNum(xe) && isFun(f) && v(f)->flags && isF64(w)) { + if (v(f)->flags) { u8 rtid = v(f)->flags-1; + if (rtid==n_rtack) { dec(w); return x; } + if (rtid==n_ltack) return C2(shape, C1(fne, x), w); + if (!(xr==1 && elNum(xe) && xe<=el_f64)) goto base; if (rtid==n_floor) return scan2_min_num(w, x, xe, ia); // ⌊ if (rtid==n_ceil ) return scan2_max_num(w, x, xe, ia); // ⌈ @@ -286,17 +319,12 @@ B scan_c2(Md1D* d, B w, B x) { B f = d->f; FC2 fc2 = c2fn(f); if (isArr(w)) { - if (!ptr_eqShape(SH(w), RNK(w), xsh+1, xr-1)) thrF("`: Shape of 𝕨 must match the cell of 𝕩 (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); - if (ia!=0) { - usz csz = arr_csz(x); - SGet(w) - for (; i < csz; i++) r.a[i] = fc2(f, Get(w,i), xget(xa,i)); - for (; i < ia; i++) r.a[i] = fc2(f, inc(r.a[i-csz]), xget(xa,i)); - } + usz csz = arr_csz(x); + SGet(w) + for (; i < csz; i++) r.a[i] = fc2(f, Get(w,i), xget(xa,i)); + for (; i < ia; i++) r.a[i] = fc2(f, inc(r.a[i-csz]), xget(xa,i)); decG(w); } else { - if (xr!=1) thrF("`: Shape of 𝕨 must match the cell of 𝕩 (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); - if (ia==0) return x; B pr = r.a[0] = fc2(f, w, xget(xa,0)); i++; for (; i < ia; i++) r.a[i] = pr = fc2(f, inc(pr), xget(xa,i)); } From 9dfeb451f8391472393f1611c1ea385c4e1116ac Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Thu, 18 May 2023 11:53:53 -0400 Subject: [PATCH 04/10] Handle empty cells in insert_base; fixes bugs in dyadic Insert --- src/builtins/cells.c | 13 +++++++------ src/builtins/fold.c | 12 +++++------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/builtins/cells.c b/src/builtins/cells.c index 7db7fe89..c32fe34d 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -32,24 +32,25 @@ B takedrop_highrank(bool take, B w, B x); // from sfns.c BSS2A X##_slc = TI(X,slice); \ incByG(X, (i64)X##_sn + ((i64)DX-1)); -#define S_SLICES(X, SLN) usz* X##_sh = SH(X); S_KSLICES(X, X##_sh, 1, SLN, 0) #define SLICE(X, S) taga(arr_shSetUO(X##_slc(X, S, X##_csz), X##_cr, X##_csh)) #define SLICEI(X) ({ B r = SLICE(X, X##p); X##p+= X##_csz; r; }) // Used by Insert in fold.c -B insert_base(B f, B x, usz xia, bool has_w, B w) { +B insert_base(B f, B x, bool has_w, B w) { assert(isArr(x) && RNK(x)>0); - S_SLICES(x, *x_sh) - usz p = xia; + usz* xsh = SH(x); + usz xn = xsh[0]; + S_KSLICES(x, xsh, 1, xn, 0) + usz p = xn*x_csz; B r = w; if (!has_w) { - p -= x_csz; + p -= x_csz; xn--; r = SLICE(x, p); } FC2 fc2 = c2fn(f); - while(p!=0) { + while (xn--) { p-= x_csz; r = fc2(f, SLICE(x, p), r); } diff --git a/src/builtins/fold.c b/src/builtins/fold.c index 8c45166f..e6ab25af 100644 --- a/src/builtins/fold.c +++ b/src/builtins/fold.c @@ -329,12 +329,11 @@ static B m1c1(B t, B f, B x) { // consumes x return r; } extern B rt_insert; -extern B insert_base(B f, B x, usz xia, bool has_w, B w); // from cells.c +extern B insert_base(B f, B x, bool has_w, B w); // from cells.c B insert_c1(Md1D* d, B x) { B f = d->f; if (isAtm(x) || RNK(x)==0) thrM("˝: 𝕩 must have rank at least 1"); - usz xia = IA(x); - if (xia==0) { SLOW2("!𝕎˝𝕩", f, x); return m1c1(rt_insert, f, x); } + if (*SH(x)==0) { SLOW2("!𝕎˝𝕩", f, x); return m1c1(rt_insert, f, x); } if (isFun(f)) { u8 rtid = v(f)->flags-1; ur xr = RNK(x); @@ -354,13 +353,12 @@ B insert_c1(Md1D* d, B x) { B f = d->f; return taga(r); } } - return insert_base(f, x, xia, 0, bi_N); + return insert_base(f, x, 0, bi_N); } B insert_c2(Md1D* d, B w, B x) { B f = d->f; if (isAtm(x) || RNK(x)==0) thrM("˝: 𝕩 must have rank at least 1"); - usz xia = IA(x); B r = w; - if (xia==0) { decG(x); return r; } + if (*SH(x)==0) { decG(x); return r; } if (isFun(f)) { if (RNK(x)==1 && isPervasiveDyExt(f)) { @@ -373,7 +371,7 @@ B insert_c2(Md1D* d, B w, B x) { B f = d->f; } } } - return insert_base(f, x, xia, 1, w); + return insert_base(f, x, 1, w); } // Arithmetic fold/insert on rows of flat rank-2 array x From 7440e2a6bc7e432abcd9068664b594f31f7d697d Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Thu, 18 May 2023 12:11:49 -0400 Subject: [PATCH 05/10] Constant and trivial cases for fold/insert --- src/builtins/fold.c | 49 +++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/src/builtins/fold.c b/src/builtins/fold.c index e6ab25af..db12f57d 100644 --- a/src/builtins/fold.c +++ b/src/builtins/fold.c @@ -168,8 +168,9 @@ B fold_c1(Md1D* d, B x) { B f = d->f; thrM("´: No identity found"); } } + if (RARE(!isFun(f))) { decG(x); if (isMd(f)) thrM("Calling a modifier"); return inc(f); } u8 xe = TI(x,elType); - if (isFun(f) && v(f)->flags) { + if (v(f)->flags) { u8 rtid = v(f)->flags-1; if (rtid==n_ltack) { B r = IGet(x, 0 ); decG(x); return r; } if (rtid==n_rtack) { B r = IGet(x, ia-1); decG(x); return r; } @@ -234,9 +235,10 @@ B fold_c1(Md1D* d, B x) { B f = d->f; B fold_c2(Md1D* d, B w, B x) { B f = d->f; if (isAtm(x) || RNK(x)!=1) thrF("´: 𝕩 must be a list (%H ≡ ≢𝕩)", x); + if (RARE(!isFun(f))) { dec(w); decG(x); if (isMd(f)) thrM("Calling a modifier"); return inc(f); } usz ia = IA(x); u8 xe = TI(x,elType); - if (isFun(f) && v(f)->flags) { + if (v(f)->flags) { u8 rtid = v(f)->flags-1; if (rtid==n_ltack) { B r = w; @@ -322,6 +324,8 @@ u64 usum(B x) { // doesn't consume; will error on non-integers, or elements <0, neg: thrM("Didn't expect negative integer"); } +B select_c1(B, B); +B select_c2(B, B, B); static B m1c1(B t, B f, B x) { // consumes x B fn = m1_d(inc(t), inc(f)); B r = c1(fn, x); @@ -333,12 +337,17 @@ extern B insert_base(B f, B x, bool has_w, B w); // from cells.c B insert_c1(Md1D* d, B x) { B f = d->f; if (isAtm(x) || RNK(x)==0) thrM("˝: 𝕩 must have rank at least 1"); - if (*SH(x)==0) { SLOW2("!𝕎˝𝕩", f, x); return m1c1(rt_insert, f, x); } - if (isFun(f)) { + usz len = *SH(x); + if (len==0) { SLOW2("!𝕎˝𝕩", f, x); return m1c1(rt_insert, f, x); } + if (len==1) return C1(select, x); + if (RARE(!isFun(f))) { decG(x); if (isMd(f)) thrM("Calling a modifier"); return inc(f); } + ur xr = RNK(x); + if (xr==1 && isPervasiveDyExt(f)) return m_unit(fold_c1(d, x)); + if (v(f)->flags) { u8 rtid = v(f)->flags-1; - ur xr = RNK(x); - if (xr==1 && isPervasiveDyExt(f)) return m_unit(fold_c1(d, x)); - if (rtid == n_join) { + if (rtid==n_ltack) return C1(select, x); + if (rtid==n_rtack) return C2(select, m_f64(-1), x); + if (rtid==n_join) { if (xr==1) return x; ShArr* rsh; if (xr>2) { @@ -357,19 +366,21 @@ B insert_c1(Md1D* d, B x) { B f = d->f; } B insert_c2(Md1D* d, B w, B x) { B f = d->f; if (isAtm(x) || RNK(x)==0) thrM("˝: 𝕩 must have rank at least 1"); - B r = w; - if (*SH(x)==0) { decG(x); return r; } - - if (isFun(f)) { - if (RNK(x)==1 && isPervasiveDyExt(f)) { - if (isAtm(w)) { - to_fold: return m_unit(fold_c2(d, w, x)); - } - if (RNK(w)==0) { - B w0=w; w = IGet(w,0); decG(w0); - goto to_fold; - } + if (*SH(x)==0) { decG(x); return w; } + if (RARE(!isFun(f))) { dec(w); decG(x); if (isMd(f)) thrM("Calling a modifier"); return inc(f); } + if (RNK(x)==1 && isPervasiveDyExt(f)) { + if (isAtm(w)) { + to_fold: return m_unit(fold_c2(d, w, x)); } + if (RNK(w)==0) { + B w0=w; w = IGet(w,0); decG(w0); + goto to_fold; + } + } + if (v(f)->flags) { + u8 rtid = v(f)->flags-1; + if (rtid==n_ltack) { dec(w); return C1(select, x); } + if (rtid==n_rtack) { decG(x); return w; } } return insert_base(f, x, 1, w); } From b5de844736b0247adb2ffedf49252834378db584 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Thu, 18 May 2023 14:52:13 -0400 Subject: [PATCH 06/10] Constants and tacks with rank, except some dyadic cases --- src/builtins/cells.c | 70 +++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/src/builtins/cells.c b/src/builtins/cells.c index c32fe34d..a767a7a4 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -304,6 +304,29 @@ static ur cell_rank(f64 r, f64 k) { // ⎉k over arg rank r return k<0? (k+r<0? 0 : k+r) : (k>r? r : k); } +// v˙⎉(-k) x +static B const_cells(B x, ur k, usz* xsh, B v, u32 chr) { // consumes v, x + u32 vr; + if (isAtm(v) || RNK(v)==0) { + if (k!=1) { vr = 0; goto rank0; } + usz cam = xsh[0]; + decG(x); + return C2(shape, m_usz(cam), v); + } else { + vr = RNK(v); + if (vr+k > UR_MAX) thrF("%c: Result rank too large", chr); + rank0:; + f64* shp; B sh = m_f64arrv(&shp, k+vr); + PLAINLOOP for (usz i=0; iflags-1; switch(rtid) { + case n_ltack: case n_rtack: + return x; case n_lt: if (cam==0) goto noCells; // toCells/toKCells don't set outer array fill return k==1 && RNK(x)>1? toCells(x) : k==0? m_unit(x) : toKCells(x, k); @@ -376,26 +401,8 @@ B for_cells_c1(B f, u32 xr, u32 cr, u32 k, B x, u32 chr) { // F⎉cr x, with arr if (rtid==n_after && !isCallable(fd->g)) return for_cells_AS(fd->f, x, inc(fd->g), cr, xr, chr); } } else if (!isMd(f)) { - const_f:; inc(f); - u32 fr; - if (isAtm(f) || RNK(f)==0) { - if (k!=1) { fr = 0; goto const_f_cont; } - usz cam = xsh[0]; - decG(x); - return C2(shape, m_usz(cam), f); - } else { - fr = RNK(f); - if (fr+k > UR_MAX) thrF("%c: Result rank too large", chr); - const_f_cont:; - f64* shp; B sh = m_f64arrv(&shp, fr+k); - PLAINLOOP for (usz i=0; i0 && wcrflags-1; + if (rtid==n_ltack) { dec(x); return w; } + if (rtid==n_rtack) return const_cells(w, wk, wsh, x, chr); + if (IA(w)!=0 && isPervasiveDy(f)) { if (isAtm(x)) return c2(f, w, x); if (RNK(x)!=wcr || !eqShPart(SH(x), wsh+wk, wcr)) goto generic; if (TI(w,elType)==el_B || TI(x,elType)==el_B || (IA(x)>(2048*8)>>arrTypeBitsLog(TY(x)) && IA(w)!=IA(x))) goto generic; return c2(f, w, C2(shape, C1(fne, incG(w)), x)); } + } else if (!isMd(f)) { + dec(x); + return const_cells(w, wk, wsh, inc(f), chr); } generic:; S_KSLICES(w, wsh, wk, cam, 1) incBy(x, cam-1); @@ -502,8 +515,11 @@ NOINLINE B for_cells_SA(B f, B w, B x, ur xcr, ur xr, u32 chr) { ur xk = xr-xcr; assert(xk>0 && xcrflags-1; + if (rtid==n_rtack) { dec(w); return x; } + if (rtid==n_ltack) return const_cells(x, xk, xsh, w, chr); if (rtid==n_select && xk==1 && isF64(w) && xr==2) return select_cells(WRAP(o2i64(w), SH(x)[1], thrF("⊏: Indexing out-of-bounds (𝕨≡%R, %s≡≠𝕩)", w, cam)), x, cam, 1, false); if (rtid==n_pick && xk==1 && TI(x,arrD1) && xr==2 && isF64(w)) return select_cells(WRAP(o2i64(w), SH(x)[1], thrF("⊑: Indexing out-of-bounds (𝕨≡%R, %s≡≠𝕩)", w, cam)), x, cam, 1, true); if ((rtid==n_shifta || rtid==n_shiftb) && xk==1 && xr==2 && isAtm(w)) { @@ -527,6 +543,9 @@ NOINLINE B for_cells_SA(B f, B w, B x, ur xcr, ur xr, u32 chr) { if (TI(w,elType)==el_B || TI(x,elType)==el_B || (IA(w)>(2048*8)>>arrTypeBitsLog(TY(w)) && IA(w)!=IA(x))) goto generic; return c2(f, C2(shape, C1(fne, incG(x)), w), x); } + } else if (!isMd(f)) { + dec(w); + return const_cells(x, xk, xsh, inc(f), chr); } generic:; S_KSLICES(x, xsh, xk, cam, 1) incBy(w, cam-1); @@ -558,6 +577,8 @@ NOINLINE B for_cells_AA(B f, B w, B x, ur wcr, ur xcr, u32 chr) { if (isFun(f)) { if (wk==xk) { u8 rtid = v(f)->flags-1; + if (rtid==n_rtack) { decG(w); return x; } + if (rtid==n_ltack) { decG(x); return w; } if (rtid==n_feq || rtid==n_fne) { Arr* r = match_cells(rtid!=n_feq, w, x, wr, xr, wk, cam); if (r==NULL) goto generic; @@ -572,6 +593,9 @@ NOINLINE B for_cells_AA(B f, B w, B x, ur wcr, ur xcr, u32 chr) { if ((wk>mr?mr:wk) != (xk>mr?mr:xk) || !eqShPart(wsh, xsh, mr)) goto generic; return c2(f, w, x); } + } else if (!isMd(f)) { + dec(xkM? w : x); + return const_cells(xkM? x : w, zk, zsh, inc(f), chr); } generic:; From ed5fac7cc9583d2c90037eacab68bfa15cbcd2fe Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Thu, 18 May 2023 15:11:20 -0400 Subject: [PATCH 07/10] Constant and tack cases for Table --- src/builtins/md1.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 40fed4b8..5d36f20c 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -42,8 +42,11 @@ B each_c1(Md1D* d, B x) { B f = d->f; if (EACH_FILLS) xf = getFillR(x); if (isAtm(x)) r = m_hunit(c1(f, x)); - else if (isFun(f)) r = eachm_fn(f, x, c(Fun,f)->c1); - else { + else if (isFun(f)) { + u8 rtid = v(f)->flags-1; + if (rtid==n_ltack || rtid==n_rtack) return x; + r = eachm_fn(f, x, c(Fun,f)->c1); + } else { usz ia = IA(x); if (isMd(f) && ia>0) { decR(x); thrM("Calling a modifier"); } MAKE_MUT(rm, ia); @@ -72,10 +75,25 @@ B tbl_c2(Md1D* d, B w, B x) { B f = d->f; usz* rsh; FC2 fc2 = c2fn(f); - if (isFun(f) && TI(w,arrD1) && isPervasiveDyExt(f)) { + if (RARE(!isFun(f))) { + if (isMd(f) && ria>0) thrM("Calling a modifier"); + MAKE_MUT(rm, ria); + mut_fill(rm, 0, f, ria); + Arr* ra = mut_fp(rm); + rsh = arr_shAlloc(ra, rr); + r = taga(ra); + } else if (v(f)->flags-1 == n_ltack) { + Arr* wd = arr_shVec(TI(w,slice)(incG(w), 0, wia)); + r = C2(slash, m_i32(xia), taga(wd)); + goto arith_finish; + } else if (v(f)->flags-1 == n_rtack) { + r = C2(shape, m_f64(ria), incG(x)); + goto arith_finish; + } else if (TI(w,arrD1) && isPervasiveDyExt(f)) { if (TI(x,arrD1) && wia>=4 && xia<2560>>arrTypeBitsLog(TY(x))) { Arr* wd = arr_shVec(TI(w,slice)(incG(w), 0, wia)); r = fc2(f, C2(slash, m_i32(xia), taga(wd)), C2(shape, m_f64(ria), incG(x))); + arith_finish:; if(RARE(!reusable(r))) r = taga(cpyWithShape(r)); arr_shErase(a(r), 1); } else if (xia>7 && wia>0) { From 93e590fd9d491f5e499ddd45034192cceb00dfff Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Thu, 18 May 2023 15:40:52 -0400 Subject: [PATCH 08/10] One case for dyadic constant-each --- src/utils/each.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/utils/each.c b/src/utils/each.c index 8c6c5239..23b605ed 100644 --- a/src/utils/each.c +++ b/src/utils/each.c @@ -38,6 +38,10 @@ B eachd_fn(B fo, B w, B x, FC2 f) { B rb; if (ria==0) { rb = rM==1? emptyHVec() : m_harrUc(bo).b; + } else if (f == arr_c2) { + MAKE_MUT(rm, ria); + mut_fill(rm, 0, fo, ria); + rb = mut_fc(rm, bo); } else { M_HARR(r, ria) if (wr==xr) { SGet(x) SGet(w) for(usz ri=0; ri Date: Fri, 19 May 2023 12:57:23 +0300 Subject: [PATCH 09/10] =?UTF-8?q?fix=20"=5Fm=E2=86=90=C2=A8=E2=8B=844=20m?= =?UTF-8?q?=C2=B4=E2=9F=A8=E2=9F=A9"=20and=20"4=2010=C2=B4=E2=9F=A8?= =?UTF-8?q?=E2=9F=A9"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/fold.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/builtins/fold.c b/src/builtins/fold.c index db12f57d..edef480b 100644 --- a/src/builtins/fold.c +++ b/src/builtins/fold.c @@ -235,15 +235,16 @@ B fold_c1(Md1D* d, B x) { B f = d->f; B fold_c2(Md1D* d, B w, B x) { B f = d->f; if (isAtm(x) || RNK(x)!=1) thrF("´: 𝕩 must be a list (%H ≡ ≢𝕩)", x); - if (RARE(!isFun(f))) { dec(w); decG(x); if (isMd(f)) thrM("Calling a modifier"); return inc(f); } usz ia = IA(x); + if (RARE(ia==0)) { decG(x); return w; } + if (RARE(!isFun(f))) { dec(w); decG(x); if (isMd(f)) thrM("Calling a modifier"); return inc(f); } + u8 xe = TI(x,elType); if (v(f)->flags) { u8 rtid = v(f)->flags-1; if (rtid==n_ltack) { - B r = w; - if (ia) { dec(w); r=IGet(x, 0); } - decG(x); return r; + B r = IGet(x, 0); + dec(w); decG(x); return r; } if (rtid==n_rtack) { decG(x); return w; } if (!isF64(w) || xe>el_f64) goto base; @@ -265,8 +266,8 @@ B fold_c2(Md1D* d, B w, B x) { B f = d->f; f64 r = sum_fns[sel](tyany_ptr(x), ia, wf); decG(x); return m_f64(r); } - if (rtid==n_floor) { f64 r=wf; if (ia>0) { f64 m=min_fns[xe-el_i8](tyany_ptr(x), ia); if (m0) { f64 m=max_fns[xe-el_i8](tyany_ptr(x), ia); if (m>r) r=m; } decG(x); return m_f64(r); } // ⌈ + if (rtid==n_floor) { f64 r=wf; f64 m=min_fns[xe-el_i8](tyany_ptr(x), ia); if (mr) r=m; decG(x); return m_f64(r); } // ⌈ i32 wi = wf; if (rtid==n_mul | rtid==n_and) { // ×/∧ void *xv = tyany_ptr(x); From f472b4f5e4a9bdbe60684e35f0e6545bd356c6c1 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 19 May 2023 13:07:21 +0300 Subject: [PATCH 10/10] update heapverify detection in test/cells.bqn --- test/cells.bqn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cells.bqn b/test/cells.bqn index 5e2abfc3..d6d87e89 100644 --- a/test/cells.bqn +++ b/test/cells.bqn @@ -8,7 +8,7 @@ hCBQNFile ← •file.At "generated/cells_hCBQNOut.bqn" validFile ← •file.At "generated/cells_valid.bqn" cbqni ← {⊑"internal"<⊸∊•listsys? •BQN"•internal"; @} -bqntype ← {cbqni≡@? 2; "harr"≡cbqni.Type ⊢⎉0 ""} # 0: full CBQN; 1: heapverify CBQN; 2: bqn.js +bqntype ← {cbqni≡@? 2; ¬cbqni.HasFill +˜0⥊<↕0} # 0: full CBQN; 1: heapverify CBQN; 2: bqn.js SHRun ← { f←•BQN"•SH"