From 9f824483eb2b72c49f35d9457f75776542ef0920 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 2 May 2021 13:48:59 +0300 Subject: [PATCH] =?UTF-8?q?cleaner=20=C2=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/h.h | 2 ++ src/mut.c | 2 +- src/sfns.c | 23 ++++++----------------- src/stuff.c | 15 +++++++++++++++ 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/h.h b/src/h.h index d0396744..e6b34c89 100644 --- a/src/h.h +++ b/src/h.h @@ -451,6 +451,8 @@ B c1_modifier(B f, B w, B x) { dec(w); dec(x); thrM("Calling a modifier"); } +BB2B c1fn(B f); +BBB2B c2fn(B f); typedef struct Md1 { diff --git a/src/mut.c b/src/mut.c index 47fa3afe..f5280948 100644 --- a/src/mut.c +++ b/src/mut.c @@ -66,7 +66,7 @@ void mut_pfree(Mut* m, usz n) { // free the first n elements else mm_free((Value*) m->val); } -// doesn't consume x; fills m[ms…ms+l] with x +// doesn't consume; fills m[ms…ms+l] with x void mut_fill(Mut* m, usz ms, B x, usz l) { again: #define AGAIN(T) { mut_to(m, T); goto again; } diff --git a/src/sfns.c b/src/sfns.c index 48948746..6e0c69bb 100644 --- a/src/sfns.c +++ b/src/sfns.c @@ -127,31 +127,20 @@ B eachm_fn(BB2B f, B fo, B x) { // consumes x; x must be array for (; i < ia; i++) rH.a[i] = f(fo, xget(x,i)); return harr_fcd(rH, x); } -B eachm(B f, B x) { // complete F¨ x +B eachm(B f, B x) { // complete F¨ x without fills if (!isArr(x)) return m_hunit(c1(f, x)); if (isFun(f)) return eachm_fn(c(Fun,f)->c1, f, x); if (isMd(f)) if (!isArr(x) || a(x)->ia) { decR(x); thrM("Calling a modifier"); } usz ia = a(x)->ia; - dec(x); - HArr_p r = m_harrUv(ia); - for(usz i = 0; i < ia; i++) r.a[i] = inc(f); - return r.b; + MAKE_MUT(r, ia); + mut_fill(r, 0, f, ia); + return mut_fcd(r, x); } -B eachd(B f, B w, B x) { // complete w F¨ x +B eachd(B f, B w, B x) { // complete w F¨ x without fills if (!isArr(w) & !isArr(x)) return m_hunit(c2(f, w, x)); - if (isFun(f)) return eachd_fn(c(Fun,f)->c2, f, w, x); - if (isArr(w) && isArr(x)) { - ur mr = rnk(w); if(rnk(w)sh, a(x)->sh, mr)) { decR(x); thrM("Mapping: Expected equal shape prefix"); } - } - if (isMd(f)) if ((isArr(w)&&a(w)->ia) || (isArr(x)&&a(x)->ia)) { decR(x); thrM("Calling a modifier"); } // case where both are units has already been taken care of - - HArr_p r = m_harrUc(!isArr(w)? x : rnk(w)>rnk(x)? w : x); - for(usz i = 0; i < r.c->ia; i++) r.a[i] = inc(f); - dec(w); dec(x); - return r.b; + return eachd_fn(c2fn(f), f, w, x); } B shape_c1(B t, B x) { if (!isArr(x)) thrM("⥊: deshaping non-array"); diff --git a/src/stuff.c b/src/stuff.c index 50273e58..7f5c7651 100644 --- a/src/stuff.c +++ b/src/stuff.c @@ -209,6 +209,21 @@ static inline void hdr_init() { assert((MD1_TAG>>1) == (MD2_TAG>>1)); // just to be sure it isn't changed incorrectly, `isMd` depends on this } +B md_c1(B t, B x) { thrM("Cannot call a modifier"); } +B md_c2(B t, B w, B x) { thrM("Cannot call a modifier"); } +B arr_c1(B t, B x) { return inc(t); } +B arr_c2(B t, B w, B x) { return inc(t); } +BB2B c1fn(B f) { + if (isFun(f)) return c(Fun,f)->c1; + if (isMd(f)) return md_c1; + return arr_c1; +} +BBB2B c2fn(B f) { + if (isFun(f)) return c(Fun,f)->c2; + if (isMd(f)) return md_c2; + return arr_c2; +} + #ifdef ALLOC_STAT u64* ctr_a = 0;