From a91e351aee2ee78521762bcfb70d80483f8278a3 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 25 Sep 2021 19:34:48 +0300 Subject: [PATCH] fix deep squeeze --- src/builtins.h | 2 +- src/builtins/internal.c | 7 +++++-- src/core/stuff.c | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/builtins.h b/src/builtins.h index 9a9bcd45..d50d48b0 100644 --- a/src/builtins.h +++ b/src/builtins.h @@ -10,7 +10,7 @@ /* sysfn.c*/M(type,"•Type") M(decp,"•Decompose") M(primInd,"•PrimInd") M(glyph,"•Glyph") A(fill,"•FillFn") M(sys,"•getsys") A(grLen,"•GroupLen") D(grOrd,"•GroupOrd") \ /* sysfn.c*/M(repr,"•Repr") M(fmt,"•Fmt") A(asrt,"!") A(casrt,"!") M(out,"•Out") M(show,"•Show") M(bqn,"•BQN") M(sh,"•SH") M(fromUtf8,"•FromUTF8") \ /* sysfn.c*/D(cmp,"•Cmp") A(hash,"•Hash") M(unixTime,"•UnixTime") M(monoTime,"•MonoTime") M(delay,"•Delay") M(makeRand,"•MakeRand") M(reBQN,"•ReBQN") M(exit,"•Exit") M(getLine,"•GetLine") \ -/*internal.c*/M(itype,"•internal.Type") M(refc,"•internal.Refc") M(squeeze,"•internal.Squeeze") M(isPure,"•internal.IsPure") A(info,"•internal.Info") \ +/*internal.c*/M(itype,"•internal.Type") M(refc,"•internal.Refc") M(squeeze,"•internal.Squeeze") M(deepSqueeze,"•internal.DeepSqueeze") M(isPure,"•internal.IsPure") A(info,"•internal.Info") \ /*internal.c*/D(variation,"•internal.Variation") A(listVariations,"•internal.ListVariations") M(clearRefs,"•internal.ClearRefs") M(unshare,"•internal.Unshare") #define FOR_PM1(A,M,D) \ diff --git a/src/builtins/internal.c b/src/builtins/internal.c index e6a52ebd..50241801 100644 --- a/src/builtins/internal.c +++ b/src/builtins/internal.c @@ -26,6 +26,9 @@ B squeeze_c1(B t, B x) { if (!isArr(x)) return x; return any_squeeze(x); } +B deepSqueeze_c1(B t, B x) { + return squeeze_deep(x); +} B isPure_c1(B t, B x) { B r = m_f64(isPureFn(x)); dec(x); @@ -258,8 +261,8 @@ B getInternalNS() { listVariations_def = m_str8l("if"); gc_addFn(variation_root); #define F(X) inc(bi_##X), - B fn = bqn_exec(m_str32(U"{⟨ Type, Refc, Squeeze, IsPure, Info, ListVariations, Variation, ClearRefs, Unshare⟩⇐𝕩}"), emptyCVec(), emptySVec()); - B arg = m_caB(9, (B[]){F(itype)F(refc)F(squeeze)F(isPure)F(info)F(listVariations)F(variation)F(clearRefs)F(unshare)}); + B fn = bqn_exec(m_str32(U"{⟨ Type, Refc, Squeeze, IsPure, Info, ListVariations, Variation, ClearRefs, Unshare, DeepSqueeze⟩⇐𝕩}"), emptyCVec(), emptySVec()); + B arg = m_caB(10,(B[]){F(itype)F(refc)F(squeeze)F(isPure)F(info)F(listVariations)F(variation)F(clearRefs)F(unshare)F(deepSqueeze)}); #undef F internalNS = c1(fn,arg); gc_add(internalNS); diff --git a/src/core/stuff.c b/src/core/stuff.c index 07c37e84..4741d979 100644 --- a/src/core/stuff.c +++ b/src/core/stuff.c @@ -582,13 +582,14 @@ B squeeze_deep(B x) { usz ia = a(x)->ia; usz i=0; HArr_p r = m_harrs(ia,&i); B* xp = arr_bptr(x); + B xf = getFillQ(x); if (xp!=NULL) { while (i < ia) { r.a[i] = squeeze_deep(inc(xp[i])); i++; } } else { SGet(x); while (i < ia) { r.a[i] = squeeze_deep(Get(x,i)); i++; } } - return any_squeeze(harr_fcd(r, x)); + return any_squeeze(qWithFill(harr_fcd(r, x), xf)); } B bqn_merge(B x) {