summaryrefslogtreecommitdiff
path: root/functions.c
diff options
context:
space:
mode:
Diffstat (limited to 'functions.c')
-rw-r--r--functions.c25
1 files changed, 20 insertions, 5 deletions
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)])