typed /
This commit is contained in:
parent
94bf7ccce0
commit
b5db412812
16
src/fns.c
16
src/fns.c
@ -102,11 +102,21 @@ B fmtF_c1(B t, B x) {
|
|||||||
return m_c32(U"+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!˙˜˘¨⌜⁼´˝`∘○⊸⟜⌾⊘◶⎉⚇⍟⎊"[fl-1]);
|
return m_c32(U"+-×÷⋆√⌊⌈|¬∧∨<>≠=≤≥≡≢⊣⊢⥊∾≍↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!˙˜˘¨⌜⁼´˝`∘○⊸⟜⌾⊘◶⎉⚇⍟⎊"[fl-1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
i64 isum(B x) { // doesn't consume; assumes is array; may error
|
i64 isum(B x) { // doesn't consume; may error; TODO error on overflow
|
||||||
BS2B xgetU = TI(x).getU;
|
assert(isArr(x));
|
||||||
i64 r = 0;
|
i64 r = 0;
|
||||||
usz xia = a(x)->ia;
|
usz xia = a(x)->ia;
|
||||||
for (usz i = 0; i < xia; i++) r+= (i64)o2f(xgetU(x,i)); // TODO error on overflow and non-integers or something
|
u8 xe = TI(x).elType;
|
||||||
|
if (xe==el_i32) {
|
||||||
|
i32* p = i32any_ptr(x);
|
||||||
|
for (usz i = 0; i < xia; i++) r+= p[i];
|
||||||
|
} else if (xe==el_f64) {
|
||||||
|
f64* p = f64any_ptr(x);
|
||||||
|
for (usz i = 0; i < xia; i++) { if(p[i]!=(f64)p[i]) thrM("Expected integer"); r+= p[i]; }
|
||||||
|
} else {
|
||||||
|
BS2B xgetU = TI(x).getU;
|
||||||
|
for (usz i = 0; i < xia; i++) r+= o2i64(xgetU(x,i));
|
||||||
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
48
src/sfns.c
48
src/sfns.c
@ -342,25 +342,47 @@ B slash_c2(B t, B w, B x) {
|
|||||||
i64 wsum = isum(w); if (wsum>USZ_MAX) thrM("/: Result too large");
|
i64 wsum = isum(w); if (wsum>USZ_MAX) thrM("/: Result too large");
|
||||||
usz ria = wsum;
|
usz ria = wsum;
|
||||||
usz ri = 0;
|
usz ri = 0;
|
||||||
HArr_p r = m_harrs(ria, &ri);
|
if (TI(w).elType==el_i32) {
|
||||||
BS2B wgetU = TI(w).getU;
|
i32* wp = i32any_ptr(w);
|
||||||
BS2B xgetU = TI(x).getU;
|
if (TI(x).elType==el_i32) {
|
||||||
for (usz i = 0; i < wia; i++) {
|
i32* xp = i32any_ptr(x);
|
||||||
B cw = wgetU(w, i);
|
i32* rp; B r = m_i32arrv(&rp, ria);
|
||||||
if (isNum(cw)) {
|
for (usz i = 0; i < wia; i++) {
|
||||||
f64 cf = o2f(cw);
|
i32 c = wp[i];
|
||||||
usz c = (usz)cf;
|
if (c<0) thrM("/: 𝕨 must consist of natural numbers");
|
||||||
if (cf!=c) goto base; // TODO clean up half-written r
|
i32 cx = xp[i];
|
||||||
|
for (usz j = 0; j < c; j++) *rp++ = cx;
|
||||||
|
}
|
||||||
|
dec(w); dec(x);
|
||||||
|
return r;
|
||||||
|
} else {
|
||||||
|
HArr_p r = m_harrs(ria, &ri);
|
||||||
|
BS2B xgetU = TI(x).getU;
|
||||||
|
for (usz i = 0; i < wia; i++) {
|
||||||
|
i32 c = wp[i];
|
||||||
|
if (c==0) continue;
|
||||||
|
if (c<0) thrM("/: 𝕨 must consist of natural numbers");
|
||||||
|
B cx = xgetU(x, i);
|
||||||
|
for (usz j = 0; j < c; j++) r.a[ri++] = inc(cx);
|
||||||
|
}
|
||||||
|
dec(w); dec(x);
|
||||||
|
return withFill(harr_fv(r), xf);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
HArr_p r = m_harrs(ria, &ri);
|
||||||
|
BS2B wgetU = TI(w).getU;
|
||||||
|
BS2B xgetU = TI(x).getU;
|
||||||
|
for (usz i = 0; i < wia; i++) {
|
||||||
|
usz c = o2s(wgetU(w, i));
|
||||||
if (c) {
|
if (c) {
|
||||||
B cx = xgetU(x, i);
|
B cx = xgetU(x, i);
|
||||||
for (usz j = 0; j < c; j++) r.a[ri++] = inc(cx);
|
for (usz j = 0; j < c; j++) r.a[ri++] = inc(cx);
|
||||||
}
|
}
|
||||||
} else { dec(cw); goto base; }
|
}
|
||||||
|
dec(w); dec(x);
|
||||||
|
return withFill(harr_fv(r), xf);
|
||||||
}
|
}
|
||||||
dec(w); dec(x);
|
|
||||||
return withFill(harr_fv(r), xf);
|
|
||||||
}
|
}
|
||||||
base:
|
|
||||||
return c2(rt_slash, w, x);
|
return c2(rt_slash, w, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user