diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 3b8a51c8..f5ce6624 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -205,7 +205,6 @@ B scan_c2(Md1D* d, B w, B x) { B f = d->f; B fold_c1(Md1D* d, B x) { B f = d->f; if (isAtm(x) || rnk(x)!=1) thrF("´: Argument must be a list (%H ≡ ≢𝕩)", x); usz ia = a(x)->ia; - u8 xe = TI(x,elType); if (ia==0) { dec(x); if (isFun(f)) { @@ -214,32 +213,33 @@ B fold_c1(Md1D* d, B x) { B f = d->f; } thrM("´: No identity found"); } + u8 xe = TI(x,elType); if (isFun(f) && v(f)->flags && xe<=el_f64) { u8 rtid = v(f)->flags-1; if (rtid==0) { // + - if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=0; for (usz i=0; ic) c=xp[i]; dec(x); return m_i32(c); } - if (xe==el_i16) { i16* xp = i16any_ptr(x); i16 c = I16_MAX; for (usz i = 0; i < ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); } - if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c = I32_MAX; for (usz i = 0; i < ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); } + if (xe==el_i8 ) { i8 * xp = i8any_ptr (x); i8 c=I8_MAX ; for (usz i=0; ic) c=xp[i]; dec(x); return m_i32(c); } + if (xe==el_i16) { i16* xp = i16any_ptr(x); i16 c=I16_MAX; for (usz i=0; ic) c=xp[i]; dec(x); return m_i32(c); } + if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=I32_MAX; for (usz i=0; ic) c=xp[i]; dec(x); return m_i32(c); } } if (rtid==11) { // ∨ - if (xe==el_i8 ) { i8 * xp = i8any_ptr (x); bool q=0; for (usz i = 0; i < ia; i++) { i8 c=xp[i]; if (c!=0&&c!=1)goto base; q|=c; } dec(x); return m_i32(q); } - if (xe==el_i16) { i16* xp = i16any_ptr(x); bool q=0; for (usz i = 0; i < ia; i++) { i16 c=xp[i]; if (c!=0&&c!=1)goto base; q|=c; } dec(x); return m_i32(q); } - if (xe==el_i32) { i32* xp = i32any_ptr(x); bool q=0; for (usz i = 0; i < ia; i++) { i32 c=xp[i]; if (c!=0&&c!=1)goto base; q|=c; } dec(x); return m_i32(q); } + if (xe==el_i8 ) { i8 * xp = i8any_ptr (x); bool q=0; for (usz i=0; if; 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); usz ia = a(x)->ia; - if (q_i32(w) && TI(x,elType)==el_i32 && isFun(f) && v(f)->flags) { + u8 xe = TI(x,elType); + if (q_i32(w) && isFun(f) && v(f)->flags && xe<=el_f64) { + i32 wi = o2iu(w); u8 rtid = v(f)->flags-1; - i32* xp = i32any_ptr(x); - i32 wv = o2iu(w); - i64 c = wv; - if (rtid==0) { // + - for (usz i = 0; i < ia; i++) if ((c+= xp[i]) > I32_MAX) goto base; - dec(x); return m_i32(c); + if (rtid==0) { // + + if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=wi; for (usz i=0; i I32_MAX) goto base; - dec(x); return m_i32(c); + if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=wi; for (usz i=0; ic) c = xp[i]; - dec(x); return m_i32(c); + if (xe==el_i8 ) { i8 * xp = i8any_ptr (x); i32 c=wi; for (usz i=0; ic) c=xp[i]; dec(x); return m_i32(c); } + if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; for (usz i=0; ic) c=xp[i]; dec(x); return m_i32(c); } + if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=0; ic) c=xp[i]; dec(x); return m_i32(c); } + } + if (rtid==11 && (wi&1)==wi) { // ∨ + if (xe==el_i8 ) { i8 * xp = i8any_ptr (x); bool q=wi; for (usz i=0; i