fix pureFn

This commit is contained in:
dzaima 2021-05-10 11:37:30 +03:00
parent 2202200a6e
commit d8751e709f
4 changed files with 19 additions and 13 deletions

View File

@ -42,7 +42,7 @@ C32Arr* toC32Arr(B x) {
B r = m_c32arrc(x);
u32* rp = c32arr_ptr(r);
usz ia = a(r)->ia;
BS2B xgetU = TI(x).get;
BS2B xgetU = TI(x).getU;
for (usz i = 0; i < ia; i++) rp[i] = o2c(xgetU(x,i));
dec(x);
return c(C32Arr,r);

View File

@ -36,7 +36,7 @@ F64Arr* toF64Arr(B x) {
B r = m_f64arrc(x);
f64* rp = f64arr_ptr(r);
usz ia = a(r)->ia;
BS2B xgetU = TI(x).get;
BS2B xgetU = TI(x).getU;
for (usz i = 0; i < ia; i++) rp[i] = o2f(xgetU(x,i));
dec(x);
return c(F64Arr,r);

View File

@ -38,7 +38,7 @@ I32Arr* toI32Arr(B x) {
B r = m_i32arrc(x);
i32* rp = i32arr_ptr(r);
usz ia = a(r)->ia;
BS2B xgetU = TI(x).get;
BS2B xgetU = TI(x).getU;
for (usz i = 0; i < ia; i++) rp[i] = o2i(xgetU(x,i));
dec(x);
return c(I32Arr,r);

View File

@ -2,16 +2,22 @@
bool isPureFn(B x) { // doesn't consume
if (!isCallable(x)) return true;
if (v(x)->flags) return true;
B2B dcf = TI(x).decompose;
B xd = dcf(inc(x));
B* xdp = harr_ptr(xd);
i32 t = o2iu(xdp[0]);
if (t<2) { dec(xd); return t==0; }
usz xdia = a(xd)->ia;
for (i32 i = 1; i<xdia; i++) if(!isPureFn(xdp[i])) { dec(xd); return false; }
dec(xd); return true;
if (isCallable(x)) {
if (v(x)->flags) return true;
B2B dcf = TI(x).decompose;
B xd = dcf(inc(x));
B* xdp = harr_ptr(xd);
i32 t = o2iu(xdp[0]);
if (t<2) { dec(xd); return t==0; }
usz xdia = a(xd)->ia;
for (i32 i = 1; i<xdia; i++) if(!isPureFn(xdp[i])) { dec(xd); return false; }
dec(xd); return true;
} else if (isArr(x)) {
usz ia = a(x)->ia;
BS2B xgetU = TI(x).getU;
for (usz i = 0; i < ia; i++) if (!isPureFn(xgetU(x,i))) return false;
return true;
} else return isNum(x) || isC32(x);
}
B homFil1(B f, B r, B xf) {