typed 𝕨𝔽´𝕩
This commit is contained in:
parent
85097f681a
commit
427450e5d8
@ -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;
|
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);
|
if (isAtm(x) || rnk(x)!=1) thrF("´: Argument must be a list (%H ≡ ≢𝕩)", x);
|
||||||
usz ia = a(x)->ia;
|
usz ia = a(x)->ia;
|
||||||
u8 xe = TI(x,elType);
|
|
||||||
if (ia==0) {
|
if (ia==0) {
|
||||||
dec(x);
|
dec(x);
|
||||||
if (isFun(f)) {
|
if (isFun(f)) {
|
||||||
@ -214,6 +213,7 @@ B fold_c1(Md1D* d, B x) { B f = d->f;
|
|||||||
}
|
}
|
||||||
thrM("´: No identity found");
|
thrM("´: No identity found");
|
||||||
}
|
}
|
||||||
|
u8 xe = TI(x,elType);
|
||||||
if (isFun(f) && v(f)->flags && xe<=el_f64) {
|
if (isFun(f) && v(f)->flags && xe<=el_f64) {
|
||||||
u8 rtid = v(f)->flags-1;
|
u8 rtid = v(f)->flags-1;
|
||||||
if (rtid==0) { // +
|
if (rtid==0) { // +
|
||||||
@ -261,26 +261,34 @@ B fold_c1(Md1D* d, B x) { B f = d->f;
|
|||||||
B fold_c2(Md1D* d, B w, 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 (isAtm(x) || rnk(x)!=1) thrF("´: 𝕩 must be a list (%H ≡ ≢𝕩)", x);
|
||||||
usz ia = a(x)->ia;
|
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;
|
u8 rtid = v(f)->flags-1;
|
||||||
i32* xp = i32any_ptr(x);
|
|
||||||
i32 wv = o2iu(w);
|
|
||||||
i64 c = wv;
|
|
||||||
if (rtid==0) { // +
|
if (rtid==0) { // +
|
||||||
for (usz i = 0; i < ia; i++) if ((c+= xp[i]) > I32_MAX) goto base;
|
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=wi; for (usz i=0; i<ia; i++) c+=xp[i]; dec(x); return m_f64(c); }
|
||||||
dec(x); return m_i32(c);
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (__builtin_add_overflow(c,xp[i],&c))goto base; dec(x); return m_i32(c); }
|
||||||
|
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (__builtin_add_overflow(c,xp[i],&c))goto base; dec(x); return m_i32(c); }
|
||||||
}
|
}
|
||||||
if (rtid==2 | rtid==10) { // ×/∧
|
if (rtid==2 | rtid==10) { // ×/∧
|
||||||
for (usz i = 0; i < ia; i++) if ((c*= xp[i]) > I32_MAX) goto base;
|
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i32 c=wi; for (usz i=0; i<ia; i++) if (__builtin_mul_overflow(c,xp[i],&c))goto base; dec(x); return m_i32(c); }
|
||||||
dec(x); return m_i32(c);
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (__builtin_mul_overflow(c,xp[i],&c))goto base; dec(x); return m_i32(c); }
|
||||||
|
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=wi; for (usz i=0; i<ia; i++) if (__builtin_mul_overflow(c,xp[i],&c))goto base; dec(x); return m_i32(c); }
|
||||||
}
|
}
|
||||||
if (rtid==6) { // ⌊
|
if (rtid==6) { // ⌊
|
||||||
for (usz i = 0; i < ia; i++) if (xp[i]<c) c = xp[i];
|
if (xe==el_i8 ) { i8 * xp = i8any_ptr (x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
dec(x); return m_i32(c);
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; 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=wi; for (usz i=0; i<ia; i++) if (xp[i]<c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
}
|
}
|
||||||
if (rtid==7) { // ⌈
|
if (rtid==7) { // ⌈
|
||||||
for (usz i = 0; i < ia; i++) if (xp[i]>c) c = xp[i];
|
if (xe==el_i8 ) { i8 * xp = i8any_ptr (x); i32 c=wi; for (usz i=0; i<ia; i++) if (xp[i]>c) c=xp[i]; dec(x); return m_i32(c); }
|
||||||
dec(x); return m_i32(c);
|
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=wi; 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=wi; for (usz i=0; i<ia; i++) if (xp[i]>c) 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<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=wi; 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=wi; 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); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
base:;
|
base:;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user