diff --git a/src/builtins/cells.c b/src/builtins/cells.c index c9060c43..b41564b2 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -701,19 +701,24 @@ NOINLINE B for_cells_SA(B f, B w, B x, ur xcr, ur xr, u32 chr) { // w⊸F⎉xcr case n_rtack: dec(w); return x; case n_ltack: return const_cells(x, xk, xsh, w, chr); case n_select: - if (isArr(w) && RNK(w)==1 && xcr==1) { // TODO handle RNK(w)!=1 + if (isArr(w) && xcr==1) { if (!TI(w,arrD1)) { w = num_squeezeChk(w); if (!TI(w,arrD1)) break; } assert(xr > 1); - ux wia = IA(w); - ShArr* rsh = m_shArr(xr); + ur wr = RNK(w); + if (wr == 0) { + usz ind = WRAP(o2i64(IGetU(w,0)), xsh[xk], break); + decG(w); + return select_cells(ind, x, cam, xk, false); + } + ur rr = xk+wr; + ShArr* rsh = m_shArr(rr); shcpy(rsh->a, xsh, xk); - rsh->a[xk] = wia; + shcpy(rsh->a+xk, SH(w), wr); Arr* r = customizeShape(select_rows_B(x, shProd(xsh,xk,xr), cam, w)); - arr_shSetUG(r, xr, rsh); - return taga(r); + return taga(arr_shSetUG(r, rr, rsh)); } if (isF64(w) && xcr>=1) { usz l = xsh[xk]; diff --git a/src/builtins/select.c b/src/builtins/select.c index 1182c30a..69eb4581 100644 --- a/src/builtins/select.c +++ b/src/builtins/select.c @@ -903,7 +903,7 @@ B select_rows_direct(B x, ux csz, ux cam, void* inds, ux indn, u8 ie) { // ⥊ ( return r; } -B select_rows_B(B x, ux csz, ux cam, B inds) { // consumes inds,x; ⥊ inds⊸⊏˘ cam‿csz⥊x +B select_rows_B(B x, ux csz, ux cam, B inds) { // consumes inds,x; ⥊ inds⊸⊏˘ cam‿csz⥊x; if inds isn't rank 1, result may or may not be high rank assert(csz*cam == IA(x)); if (csz==0) goto generic; if (cam<=1) { diff --git a/test/cases/cells.bqn b/test/cases/cells.bqn index 69d91405..610e5cbf 100644 --- a/test/cases/cells.bqn +++ b/test/cases/cells.bqn @@ -97,11 +97,17 @@ !"⊏: Indexing out-of-bounds (1000∊𝕨, 3≡≠𝕩)" % %USE evar ⋄ (3⥊1000) {𝕨⊸⊏˘𝕩}_evar 100‿3⥊1 !"⊏: Indexing out-of-bounds (1000∊𝕨, 4≡≠𝕩)" % %USE evar ⋄ (4⥊1000) {𝕨⊸⊏˘𝕩}_evar 100‿4⥊1 !"⊏: Indexing out-of-bounds (1000∊𝕨, 8≡≠𝕩)" % %USE evar ⋄ (8⥊1000) {𝕨⊸⊏˘𝕩}_evar 100‿8⥊1 +!"⊏: Indexing out-of-bounds (100∊𝕨, 8≡≠𝕩)" % %USE evar ⋄ (<100) {𝕨⊸⊏˘𝕩}_evar 100‿8⥊1 +!"Integer out of range: 9e99" % %USE evar ⋄ (<9e99) {𝕨⊸⊏˘𝕩}_evar 100‿8⥊1 ⟨1‿2⟩⊸⊏˘ 10‿8⥊↕100 %% (8×↕10) +⌜ 1‿2 ⟨1‿2⟩⊸⊏˘ 10‿4‿2⥊↕100 %% (8×↕10) +⌜ [2‿3,4‿5] ⟨1‿2,⟨1,0⟩⟩⊸⊏˘ 10‿4‿2⥊↕100 %% (8×↕10) +⌜ [3‿2,5‿4] [2‿1,4‿5]⊸⊏˘ 10‿8⥊↕100 %% (8×↕10) +⌜ [2‿1,4‿5] [1‿1,0‿1]⊸⊏˘ 10‿2‿2⥊↕100 %% (4×↕10) +⌜ 2‿2‿2⥊2‿3‿2‿3‿0‿1‿2‿3 +%USE eqvar ⋄ [2‿1‿3,4‿5‿7] {𝕨⊸⊏˘ 𝕩}_eqvar 10‿8⥊↕100 %% (8×↕10) +⌜ [2‿1‿3,4‿5‿7] +%USE eqvar ⋄ [2‿1‿3,4‿5‿7] {𝕨⊸⊏⎉1𝕩}_eqvar 3‿4‿8⥊↕100 %% (3‿4⥊8×↕12) +⌜ [2‿1‿3,4‿5‿7] +%USE eqvar ⋄ [2‿1‿3,4‿5‿7] {𝕨⊸⊏˘ 𝕩}_eqvar 1‿8⥊↕100 %% ≍[2‿1‿3,4‿5‿7] +%USE eqvar ⋄ (<2) {𝕨⊸⊏˘𝕩}_eqvar 10‿8⥊↕100 %% 2 + 8×↕10 ≍⁼˘ 10‿1⥊↕10 %% ↕10 ≍⁼˘ 10‿1‿3⥊↕30 %% 10‿3⥊↕30