diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 39590884..8dd83565 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -11,8 +11,9 @@ static Arr* take_impl(usz ria, B x) { // consumes x; returns vā†‘ā„Šš•© without MAKE_MUT(r, ria); mut_init(r, TI(x,elType)); mut_copyG(r, 0, x, 0, xia); mut_fill(r, xia, xf, ria-xia); - dec(x); dec(xf); - return mut_fp(r); + dec(x); + if (r->type!=el_B) { dec(xf); return mut_fp(r); } + return a(withFill(mut_fv(r), xf)); } else { return TI(x,slice)(x,0,ria); } diff --git a/src/utils/mut.h b/src/utils/mut.h index 96c5a3e8..5b7b40b1 100644 --- a/src/utils/mut.h +++ b/src/utils/mut.h @@ -57,10 +57,10 @@ static void mut_init(Mut* m, u8 n) { void mut_to(Mut* m, u8 n); static B mut_fv(Mut* m) { assert(m->type!=el_MAX); - m->val->sh = &m->val->ia; - B r = taga(m->val); - srnk(r, 1); - return r; + Arr* a = m->val; + a->sh = &a->ia; + sprnk(a, 1); + return taga(a); } static B mut_fc(Mut* m, B x) { assert(m->type!=el_MAX); Arr* a = m->val;