From dbb716d26d82ab8fbe44601f4af2ad9873d1dc1c Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Sat, 12 Feb 2022 14:06:30 +0000 Subject: Handle prototypes a bit better, but I suspect not everywhere --- functions.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'functions.c') diff --git a/functions.c b/functions.c index 9eb444e..b2e4d9f 100644 --- a/functions.c +++ b/functions.c @@ -577,8 +577,11 @@ fnMix(Array *right) Array * fnSplit(Array *right) { - Rune *code = L"0≡≢⍴⍵: ⍵ ⋄ 1≡≢⍴⍵: ⊂⍵ ⋄ (⊂⍵)⌷⍨¨⍳≢⍵"; - return rundfn(code, nil, nil, nil, right); + Rune *code = L"0≡≢⍴⍵: ⍵ ⋄ 1≡≢⍴⍵: ⊂⍵ ⋄ (⊂⍵)⌷⍨¨⍳¯1↓⍴⍵"; + Array *result = rundfn(code, nil, nil, nil, right); + if(GetSize(result) == 0) + result->prototype = rundfn(L"⊂(⊃⌽⍴⍵)↑⎕proto ⍵", nil, nil, nil, right); + return result; } Array * @@ -597,9 +600,12 @@ fnEnclose(Array *right) Array * fnDisclose(Array *right) { - if(GetSize(right) == 0) - return fillelement(right); - else + if(GetSize(right) == 0){ + Array *fill = fillelement(right); + Array *res = fnDisclose(fill); + freearray(fill); + return res; + }else return arrayitem(right, 0); } @@ -1321,6 +1327,9 @@ fnTake(Array *left, Array *right) for(i = 0; i < GetRank(right); i++) result->shape[i] = shape[i]; + if(size == 0) + result->prototype = fnSame(fill); + int *index = emallocz(sizeof(int) * GetSize(left), 1); int fromindex; for(i = 0; i < size; i++){ @@ -1778,6 +1787,9 @@ fnCatenateFirst(Array *left, Array *right) freearray(leftarr); freearray(rightarr); + + if(GetSize(result) == 0) + result->prototype = fillelement(left); return result; } @@ -1793,6 +1805,9 @@ fnReshape(Array *left, Array *right) return arrayitem(right, 0); Array *res = allocarray(GetType(right), GetSize(left), size); + if(size == 0) + res->prototype = fillelement(right); + for(i = 0; i < GetSize(left); i++) res->shape[i] = left->intdata[i]; for(i = 0, p = res->rawdata; i < size; i++, p += datasizes[GetType(res)]) -- cgit v1.2.3