diff --git a/src/builtins/md1.c b/src/builtins/md1.c index b3285d36..826ff385 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -92,35 +92,25 @@ B scan_c1(Md1D* d, B x) { B f = d->f; usz ia = a(x)->ia; if (ia==0) return x; B xf = getFillQ(x); - if (xr==1 && TI(x,elType)==el_i32 && isFun(f) && v(f)->flags) { + u8 xe = TI(x,elType); + if (xr==1 && xe<=el_f64 && isFun(f) && v(f)->flags) { u8 rtid = v(f)->flags-1; - i32* xp = i32any_ptr(x); if (rtid==0) { // + - i32* rp; B r = m_i32arrv(&rp, ia); - i64 c = 0; - for (usz i = 0; i < ia; i++) { - rp[i] = c+= xp[i]; - if (c>I32_MAX) { dec(r); goto base; } - } - dec(x); - return r; + if (xe==el_i8 ) { i8* xp=i8any_ptr (x); i32* rp; B r=m_i32arrv(&rp, ia); i16 c=0; for (usz i=0; ic) c = xp[i]; - rp[i] = c; - } - dec(x); - return r; + if (xe==el_i8 ) { i8* xp=i8any_ptr (x); i8* rp; B r=m_i8arrv (&rp, ia); i8 c=I8_MIN ; for (usz i=0; ic)c=xp[i]; rp[i]=c; } dec(x); return r; } + if (xe==el_i16) { i16* xp=i16any_ptr(x); i16* rp; B r=m_i16arrv(&rp, ia); i16 c=I16_MIN; for (usz i=0; ic)c=xp[i]; rp[i]=c; } dec(x); return r; } + if (xe==el_i32) { i32* xp=i32any_ptr(x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=I32_MIN; for (usz i=0; ic)c=xp[i]; rp[i]=c; } dec(x); return r; } } if (rtid==14) { // ≠ - i32* rp; B r = m_i32arrv(&rp, ia); - i32 c = 0; - for (usz i = 0; i < ia; i++) rp[i] = c = c!=xp[i]; - dec(x); - return r; + f64 x0 = IGetU(x,0).f; + if (x0 != (i8)x0) goto base; + if (xe==el_i8 ) { i8* xp=i8any_ptr (x); i8* rp; B r=m_i8arrv(&rp, ia); i8 c=(i8)x0; rp[0]=c; for (usz i=1; if; 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_i8 ) { i8* xp = i8any_ptr (x); i8 c=I8_MIN ; 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_MIN; 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_MIN; 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; if; if (isAtm(x) || rnk(x)!=1) thrF("´: 𝕩 must be a list (%H ≡ ≢𝕩)", x); usz ia = a(x)->ia; u8 xe = TI(x,elType); - if (q_i32(w) && isFun(f) && v(f)->flags && xe<=el_f64) { + if (q_i32(w) && isFun(f) && v(f)->flags && xeflags-1; if (rtid==0) { // + @@ -276,17 +268,17 @@ B fold_c2(Md1D* d, B w, B x) { B f = d->f; 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 (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