diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 78a8e795..4918c706 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -198,65 +198,72 @@ B shape_c1(B t, B x) { } B shape_c2(B t, B w, B x) { - usz xia = isArr(x)? IA(x) : 1; usz nia = 1; ur nr; ShArr* sh; - if (isF64(w)) { - nia = o2s(w); + usz tmp; + if (q_usz(w)) { + nia = o2sG(w); nr = 1; sh = NULL; } else { if (RARE(isAtm(w))) w = m_unit(w); - if (RNK(w)>1) thrM("𝕨β₯Šπ•©: 𝕨 must have rank at most 1"); - if (IA(w)>UR_MAX) thrM("𝕨β₯Šπ•©: Result rank too large"); + if (RNK(w) > 1) thrF("𝕨β₯Šπ•©: 𝕨 must be a list or unit (%i ≑ =𝕩)", RNK(w)); + if (IA(w) > UR_MAX) thrF("𝕨β₯Šπ•©: Result rank too large (%i ≑ ≠𝕨)", IA(w)); nr = IA(w); - sh = nr<=1? NULL : m_shArr(nr); + sh = nr<=1? RFLD(&tmp,ShArr,a) : m_shArr(nr); + SGetU(w) i32 unkPos = -1; - i32 unkInd ONLY_GCC(=0); + i32 unkID ONLY_GCC(=0); + usz xia ONLY_GCC(=0); bool bad=false, good=false; for (i32 i = 0; i < nr; i++) { B c = GetU(w, i); - if (isF64(c)) { - usz v = o2s(c); - if (sh) sh->a[i] = v; - bad|= mulOn(nia, v); + if (q_usz(c)) { + usz v = o2sG(c); + sh->a[i] = v; + if (RARE(mulOn(nia, v))) bad = true; good|= v==0; } else { - if (isArr(c) || !isVal(c)) thrM("𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑"); + if (RARE(!isPrim(c))) { + if (isF64(c)) thrF("𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑ (contained %B)", c); + else thrF("𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑ (contained %S)", genericDesc(c)); + } if (unkPos!=-1) thrM("𝕨β₯Šπ•©: 𝕨 contained multiple computed axes"); unkPos = i; - if (!isPrim(c)) thrM("𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑"); - unkInd = RTID(c); - good|= xia==0 | unkInd==n_floor; + unkID = RTID(c); + xia = isArr(x)? IA(x) : 1; + good|= xia==0 | unkID==n_floor; } } if (bad && !good) thrM("𝕨β₯Šπ•©: 𝕨 too large"); + if (unkPos!=-1) { - if (unkInd!=n_atop & unkInd!=n_floor & unkInd!=n_reverse & unkInd!=n_take) thrM("𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑"); + if (unkID!=n_atop & unkID!=n_floor & unkID!=n_reverse & unkID!=n_take) thrF("𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑ (contained %B)", GetU(w,unkPos)); if (nia==0) thrM("𝕨β₯Šπ•©: Can't compute axis when the rest of the shape is empty"); - i64 div = xia/nia; - i64 mod = xia%nia; + usz div = xia/nia; + usz mod = xia%nia; usz item; bool fill = false; - if (unkInd == n_atop) { - if (mod!=0) thrM("𝕨β₯Šπ•©: Shape must be exact when reshaping with ∘"); + if (unkID == n_atop) { + if (mod!=0) thrF("𝕨β₯Šπ•©: Shape must be exact when reshaping with ∘ (%H ≑ ≒𝕩, %s is the product of non-computed axis)", x, nia); item = div; - } else if (unkInd == n_floor) { + } else if (unkID == n_floor) { item = div; - } else if (unkInd == n_reverse) { + } else if (unkID == n_reverse) { item = mod? div+1 : div; - } else if (unkInd == n_take) { + } else if (unkID == n_take) { item = mod? div+1 : div; fill = true; } else UD; - if (sh) sh->a[unkPos] = item; + sh->a[unkPos] = item; nia = uszMul(nia, item); if (fill) { if (!isArr(x)) x = m_unit(x); x = taga(arr_shVec(take_impl(nia, x))); - xia = nia; + decG(w); + return truncReshape(x, nia, nia, nr, sh); // could be improved } } decG(w); @@ -264,6 +271,7 @@ B shape_c2(B t, B w, B x) { Arr* r; if (isArr(x)) { + usz xia = IA(x); if (nia <= xia) { return truncReshape(x, xia, nia, nr, sh); } else { diff --git a/test/cases/fills.bqn b/test/cases/fills.bqn index 175e94f9..9ce72a22 100644 --- a/test/cases/fills.bqn +++ b/test/cases/fills.bqn @@ -53,6 +53,8 @@ 2↑ 'a'⊸+Β¨ 1 %% "b " 2↑ {⇐} 'a'⊸+Β¨ 1 %% "b " +β€’internal.HasFill ⟨⟩β₯Š"ab"β€Ώ"cde" %% 0 + # TODO: # βŸ¨β†‘β€Ώ3β₯Šβ†•10 β‹„ ↑‿3β₯Š<¨↕10 β‹„ ↑‿3β₯Š<Λ˜β†•10⟩ # 5β€ΏΒ―5β†‘βŒœβŸ¨β†•2 β‹„ "ab" β‹„ <¨↕2 β‹„ <Λ˜β†•2⟩ diff --git a/test/cases/prims.bqn b/test/cases/prims.bqn index 380d4d70..39d3adbe 100644 --- a/test/cases/prims.bqn +++ b/test/cases/prims.bqn @@ -379,9 +379,37 @@ b←1↓1∾a←"hello" β‹„ b ⌽⎊'e' β₯ŠβŸœ1⍟2 5 β‹„ a ≑○‒Hash b %% 1 ≑0 %% 0 # 𝕨β₯Šπ•© -!"𝕨β₯Šπ•©: Result rank too large" % (0∾300β₯Š2)β₯Š0 +!"𝕨β₯Šπ•©: Result rank too large (301 ≑ ≠𝕨)" % (0∾300β₯Š2)β₯Š0 !"Out of memory" % %USE eqerr β‹„ {(𝕩β₯Š2) β₯Š 1.1}Β¨_eqerr 63-↕10 !"Out of memory" % %USE eqerr β‹„ {(𝕩β₯Š2) β₯Š 7β₯Š1.1}Β¨_eqerr 63-↕10 +1e8β€Ώ1e8β€ΏβŒŠβ€Ώ1e8β€Ώ1e8β₯Šβ†•5 %% 1e8β€Ώ1e8β€Ώ0β€Ώ1e8β€Ώ1e8β₯Š0 +⍷ {1e8β€Ώ1e8‿𝕩‿1e8β€Ώ1e8β₯Šβ†•0}Β¨ βˆ˜β€ΏβŒ½β€Ώβ†‘ %% β‹ˆ 1e8β€Ώ1e8β€Ώ0β€Ώ1e8β€Ώ1e8β₯Š0 +!"𝕨β₯Šπ•©: 𝕨 too large" % %USE eqerr β‹„ {1e8β€Ώ1e8‿𝕩‿1e8β€Ώ1e8β₯Š"foo"}_eqerr βˆ˜β€ΏβŒ½β€Ώβ†‘ + +!"𝕨β₯Šπ•©: 𝕨 must be a list or unit (4 ≑ =𝕩)" % %USE eqerr β‹„ ⟨3β€Ώ1β€Ώ4β€Ώ1β₯Š2⟩ β₯Š_eqerr βŸ¨β†•10, ↕0, 4⟩ +!"𝕨β₯Šπ•©: Empty 𝕩 and non-empty result" % 10β€Ώ10β₯Šβ†•0 +!"𝕨β₯Šπ•©: Shape must be exact when reshaping with ∘ (⟨42⟩ ≑ ≒𝕩, 10 is the product of non-computed axis)" % βˆ˜β€Ώ2β€Ώ5 β₯Š ↕42 +!"𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑ (contained namespace)" % %USE eqerr β‹„ ({βŸ¨π•©,β‹ˆπ•©,1β€Ώπ•©βŸ©} {⇐}) β₯Š_eqerr βŸ¨β†•0, 1, ↕10⟩ +!"𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑ (contained function)" % %USE eqerr β‹„ ({βŸ¨π•©,β‹ˆπ•©,1β€Ώπ•©βŸ©}{+Β¨}) β₯Š_eqerr βŸ¨β†•0, 1, ↕10⟩ +!"𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑ (contained function)" % %USE eqerr β‹„ ({βŸ¨π•©,β‹ˆπ•©,1β€Ώπ•©βŸ©}β€’out) β₯Š_eqerr βŸ¨β†•0, 1, ↕10⟩ +!"𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑ (contained Β¨)" % %USE eqerr β‹„ ({βŸ¨π•©,β‹ˆπ•©,1β€Ώπ•©βŸ©} {Β¨}) β₯Š_eqerr βŸ¨β†•0, 1, ↕10⟩ +!"𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑ (contained ∧)" % %USE eqerr β‹„ ({βŸ¨π•©,β‹ˆπ•©,1β€Ώπ•©βŸ©} {∧}) β₯Š_eqerr βŸ¨β†•0, 1, ↕10⟩ +!"𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑ (contained 1e40)" % %USE eqerr β‹„ ({βŸ¨π•©,β‹ˆπ•©,1β€Ώπ•©βŸ©}1e40) β₯Š_eqerr βŸ¨β†•0, 1, ↕10⟩ +!"𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑ (contained Β―10)" % %USE eqerr β‹„ ({βŸ¨π•©,β‹ˆπ•©,1β€Ώπ•©βŸ©} Β―10) β₯Š_eqerr βŸ¨β†•0, 1, ↕10⟩ +!"𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑ (contained 10.5)" % %USE eqerr β‹„ ({βŸ¨π•©,β‹ˆπ•©,1β€Ώπ•©βŸ©}10.5) β₯Š_eqerr βŸ¨β†•0, 1, ↕10⟩ +!"𝕨β₯Šπ•©: Can't compute axis when the rest of the shape is empty" % %USE eqerr β‹„ βˆ˜β€ΏβŒ½β€Ώβ†‘β€ΏβŒŠ {4‿𝕨‿0 β₯Š 𝕩}_eqerr βŸ¨β†•1, ↕0⟩ +⍷ β₯ŠβŸœβŸ¨βŸ©Β¨ βˆ˜β€ΏβŒŠβ€Ώβ†‘β€ΏβŒ½ %% β‹ˆ ⟨⟩ +⍷ β₯ŠβŸœ1Β¨ βˆ˜β€ΏβŒŠβ€Ώβ†‘β€ΏβŒ½ %% β‹ˆ ⟨1⟩ +⍷ β₯ŠβŸœ"hello"Β¨ βˆ˜β€ΏβŒŠβ€Ώβ†‘β€ΏβŒ½ %% β‹ˆ "hello" +!"𝕨β₯Šπ•©: 𝕨 contained multiple computed axes" % βˆ˜β€Ώβˆ˜β₯Š1 +!"𝕨β₯Šπ•©: 𝕨 contained multiple computed axes" % βˆ˜β€Ώβˆ§β₯Š1 + +%USE eqvarv β‹„ ↑‿4 β₯Š_eqvarv_"i" ↕9 %% [0β€Ώ1β€Ώ2β€Ώ3, 4β€Ώ5β€Ώ6β€Ώ7, 8β€Ώ0β€Ώ0β€Ώ0] +%USE eqvar β‹„ βŒ½β€Ώ4 β₯Š_eqvar ↕9 %% [0β€Ώ1β€Ώ2β€Ώ3, 4β€Ώ5β€Ώ6β€Ώ7, 8β€Ώ0β€Ώ1β€Ώ2] +%USE eqvar β‹„ βŒŠβ€Ώ4 β₯Š_eqvar ↕9 %% [0β€Ώ1β€Ώ2β€Ώ3, 4β€Ώ5β€Ώ6β€Ώ7] +%USE eqvarv β‹„ ↑‿4 β₯Š_eqvarv_"i" "abcde" %% ["abcd", "e "] +%USE eqvar β‹„ βŒ½β€Ώ4 β₯Š_eqvar "abcde" %% ["abcd", "eabc"] +%USE eqvar β‹„ βŒŠβ€Ώ4 β₯Š_eqvar "abcde" %% ["abcd"] # 𝕨⍷𝕩 %USE eqvar β‹„ "ab" ⍷_eqvar "" %% ⟨⟩