diff --git a/src/load.c b/src/load.c index de70f8df..32bd8322 100644 --- a/src/load.c +++ b/src/load.c @@ -52,7 +52,7 @@ static inline void load_init() { bool rtComplete[] = { /* +-×÷⋆√⌊⌈|¬ */ 1,1,1,1,1,0,1,1,1,1, /* ∧∨<>≠=≤≥≡≢ */ 1,1,1,1,1,1,1,1,1,1, - /* ⊣⊢⥊∾≍↑↓↕«» */ 1,1,0,1,1,0,0,1,1,1, + /* ⊣⊢⥊∾≍↑↓↕«» */ 1,1,0,1,1,1,1,1,1,1, /* ⌽⍉/⍋⍒⊏⊑⊐⊒∊ */ 0,0,1,1,0,1,1,0,0,0, /* ⍷⊔!˙˜˘¨⌜⁼´ */ 0,0,1,1,1,0,1,1,0,1, /* ˝`∘○⊸⟜⌾⊘◶⎉ */ 0,1,1,1,1,1,0,1,0,0, @@ -101,6 +101,8 @@ static inline void load_init() { rt_gradeUp = rtObjGet(rtObjRaw, 33); gc_add(rt_gradeUp); rt_ud = rtObjGet(rtObjRaw, 27); gc_add(rt_ud); rt_pick = rtObjGet(rtObjRaw, 36); gc_add(rt_pick); + rt_take = rtObjGet(rtObjRaw, 25); gc_add(rt_take); + rt_drop = rtObjGet(rtObjRaw, 26); gc_add(rt_drop); for (usz i = 0; i < runtimeLen; i++) { #ifdef ALL_R1 diff --git a/src/sfns.c b/src/sfns.c index 663c9cbf..0613143f 100644 --- a/src/sfns.c +++ b/src/sfns.c @@ -392,15 +392,36 @@ B slicev(B x, usz s, usz ia) { arr_shVec(r, ia); return r; } +B rt_take, rt_drop; +B take_c1(B t, B x) { return c1(rt_take, x); } +B drop_c1(B t, B x) { return c1(rt_drop, x); } B take_c2(B t, B w, B x) { - if (isAtm(x) || rnk(x)!=1) thrM("↑: NYI 1≠=𝕩"); - i64 v = o2i64(w); usz ia = a(x)->ia; - return v<0? slicev(x, ia+v, -v) : slicev(x, 0, v); + if (isNum(w) && isArr(x) && rnk(x)==1) { + i64 v = o2i64(w); + usz ia = a(x)->ia; + u64 va = v<0? -v : v; + if (va>ia) { + MAKE_MUT(r, va); + B xf = getFillE(x); + mut_copy(r, v<0? va-ia : 0, x, 0, ia); + mut_fill(r, v<0? 0 : ia, xf, va-ia); + dec(x); + dec(xf); + return mut_fv(r); + } + if (v<0) return slicev(x, ia+v, -v); + else return slicev(x, 0, v); + } + return c2(rt_take, w, x); } B drop_c2(B t, B w, B x) { - if (isAtm(x) || rnk(x)!=1) thrM("↓: NYI 1≠=𝕩"); - i64 v = o2i64(w); usz ia = a(x)->ia; - return v<0? slicev(x, 0, v+ia) : slicev(x, v, ia-v); + if (isNum(w) && isArr(x) && rnk(x)==1) { + i64 v = o2i64(w); + usz ia = a(x)->ia; + if (v<0) return -v>ia? slicev(x, 0, 0) : slicev(x, 0, v+ia); + else return v>ia? slicev(x, 0, 0) : slicev(x, v, ia-v); + } + return c2(rt_drop, w, x); } B rt_join; @@ -599,7 +620,10 @@ B shifta_c2(B t, B w, B x) { return qWithFill(mut_fcd(r, x), f); } -#define F(A,M,D) A(shape) A(pick) A(pair) A(select) A(slash) A(join) A(couple) A(shiftb) A(shifta) D(take) D(drop) + + + +#define F(A,M,D) A(shape) A(pick) A(pair) A(select) A(slash) A(join) A(couple) A(shiftb) A(shifta) A(take) A(drop) BI_FNS0(F); static inline void sfns_init() { BI_FNS1(F) } #undef F