From d0ab7423134a1008d0530e1fce1cc4499be3310f Mon Sep 17 00:00:00 2001 From: dzaima Date: Thu, 29 May 2025 22:54:08 +0300 Subject: [PATCH] =?UTF-8?q?extract=201=E2=89=A5=E2=89=A0=F0=9D=95=A8=20cas?= =?UTF-8?q?e=20of=20=F0=9D=95=A8=E2=A5=8A=F0=9D=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit temporarily calling back into shape_c2 when necessary --- src/builtins/sfns.c | 49 +++++++++++++++++++++++++++++++++++--------- test/cases/prims.bqn | 5 +++-- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 4918c706..038913bf 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -197,21 +197,53 @@ B shape_c1(B t, B x) { return taga(arr_shVec(TI(x,slice)(x, 0, ia))); } +static void shape_c2_prim0(B c) { + 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)); + } +} +#define SHAPE_C2_PRIM1(ID, GET) if (ID!=n_atop & ID!=n_floor & ID!=n_reverse & ID!=n_take) thrF("𝕨β₯Šπ•©: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑ (contained %B)", GET) + +B shape_c2(B t, B w, B x); +B shape_c2_01(usz wia, B w, B x) { + switch (wia) { default: UD; + case 0: // ⟨⟩β₯Šx + decG(w); + if (isAtm(x)) return m_unit(x); + if (RARE(IA(x) == 0)) thrM("𝕨β₯Šπ•©: Empty 𝕩 and non-empty result"); + return taga(arr_rnk01(take_impl(1, x), 0)); + case 1: // ⟨x⟩β₯Š1 + w = TO_GET(w,0); + // fallthrough + case 2: // atom + if (!q_usz(w)) { + shape_c2_prim0(w); + u8 id = RTID(w); + SHAPE_C2_PRIM1(id, w); + decG(w); + return C1(shape, x); + } + return C2(shape, w, x); + } +} + B shape_c2(B t, B w, B x) { usz nia = 1; ur nr; ShArr* sh; - usz tmp; if (q_usz(w)) { nia = o2sG(w); nr = 1; sh = NULL; } else { - if (RARE(isAtm(w))) w = m_unit(w); + if (RARE(isAtm(w))) return shape_c2_01(2, w, x); 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? RFLD(&tmp,ShArr,a) : m_shArr(nr); + usz wia = IA(w); + if (wia <= 1) return shape_c2_01(wia, w, x); + if (wia > UR_MAX) thrF("𝕨β₯Šπ•©: Result rank too large (%i ≑ ≠𝕨)", wia); + nr = wia; + sh = m_shArr(nr); SGetU(w) i32 unkPos = -1; @@ -226,10 +258,7 @@ B shape_c2(B t, B w, B x) { if (RARE(mulOn(nia, v))) bad = true; good|= v==0; } else { - 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)); - } + shape_c2_prim0(c); if (unkPos!=-1) thrM("𝕨β₯Šπ•©: 𝕨 contained multiple computed axes"); unkPos = i; unkID = RTID(c); @@ -240,7 +269,7 @@ B shape_c2(B t, B w, B x) { if (bad && !good) thrM("𝕨β₯Šπ•©: 𝕨 too large"); if (unkPos!=-1) { - 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)); + SHAPE_C2_PRIM1(unkID, GetU(w,unkPos)); if (nia==0) thrM("𝕨β₯Šπ•©: Can't compute axis when the rest of the shape is empty"); usz div = xia/nia; usz mod = xia%nia; diff --git a/test/cases/prims.bqn b/test/cases/prims.bqn index 0da2ccaa..a463f112 100644 --- a/test/cases/prims.bqn +++ b/test/cases/prims.bqn @@ -387,8 +387,8 @@ b←1↓1∾a←"hello" β‹„ b ⌽⎊'e' β₯ŠβŸœ1⍟2 5 β‹„ a ≑○‒Hash b %% 1 !"𝕨β₯Šπ•©: 𝕨 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 +!"𝕨β₯Šπ•©: Empty 𝕩 and non-empty result" % %USE eqerr β‹„ ⟨10β€Ώ10, 1, ⟨⟩, β‹ˆ1⟩ β₯Š_eqerr βŸ¨β†•0, "", 0β€Ώ0β₯Š0, 10β€Ώ0β₯Š"", 0β€Ώ10β₯Š<"hi"⟩ +!"𝕨β₯Šπ•©: Empty 𝕩 and non-empty result" % %USE eqvar β‹„ (↕0) β₯Š_eqvar ↕0 !"𝕨β₯Šπ•©: 𝕨 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⟩ @@ -397,6 +397,7 @@ b←1↓1∾a←"hello" β‹„ b ⌽⎊'e' β₯ŠβŸœ1⍟2 5 β‹„ a ≑○‒Hash b %% 1 !"𝕨β₯Šπ•©: 𝕨 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⟩ +!"𝕨β₯Šπ•©: Shape must be exact when reshaping with ∘ (⟨42⟩ ≑ ≒𝕩, 10 is the product of non-computed axis)" % βˆ˜β€Ώ2β€Ώ5 β₯Š ↕42 !"𝕨β₯Šπ•©: Can't compute axis when the rest of the shape is empty" % %USE eqerr β‹„ βˆ˜β€ΏβŒ½β€Ώβ†‘β€ΏβŒŠ {4‿𝕨‿0 β₯Š 𝕩}_eqerr βŸ¨β†•1, ↕0⟩ ⍷ β₯ŠβŸœβŸ¨βŸ©Β¨ βˆ˜β€ΏβŒŠβ€Ώβ†‘β€ΏβŒ½ %% β‹ˆ ⟨⟩ ⍷ β₯ŠβŸœ1Β¨ βˆ˜β€ΏβŒŠβ€Ώβ†‘β€ΏβŒ½ %% β‹ˆ ⟨1⟩