diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-02-01 15:53:12 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-02-01 15:53:12 +0000 |
commit | 68d8437658cd000256ab135526e09590af4bf6c5 (patch) | |
tree | 4660576ffad691fb8d902a7cc39455db7618db3d /functions.c | |
parent | 116206c95ecccf49fcce426b0f353d84a17b3314 (diff) |
Redefine scalar extension
Diffstat (limited to 'functions.c')
-rw-r--r-- | functions.c | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/functions.c b/functions.c index 4b93b44..df90cf4 100644 --- a/functions.c +++ b/functions.c @@ -892,22 +892,33 @@ fnSelfReference1(Array *right) #define SCALAR_FUNCTION_2(name, forcefloat, restype, cases) \ Array *name(Array *left, Array *right){\ Array *leftarr, *rightarr;\ - if(!commontype(left, right, &leftarr, &rightarr, forcefloat)) throwerror(nil, EType);\ - if(!scalarextend(leftarr, rightarr, &left, &right)) throwerror(L"scalar extension fail", ERank);\ + int nested = left->type == AtypeArray || right->type == AtypeArray;\ + if(nested){\ + leftarr = fnSame(left);\ + rightarr = fnSame(right);\ + }else{\ + if(!commontype(left, right, &leftarr, &rightarr, forcefloat))\ + throwerror(nil, EType);\ + }\ + if(!scalarextend(leftarr, rightarr, &left, &right)) throwerror(L"Scalar extension fail", ERank);\ Array *res;\ - if(left->type != AtypeArray && restype != left->type)\ - res = duparrayshape(left, restype);\ - else\ - res = duparray(left);\ - for(int i = 0; i < left->size; i++)\ - switch(left->type){\ - default: throwerror(nil, EType); break;\ - case AtypeArray:\ - freearray(res->arraydata[i]);\ - res->arraydata[i] = name(left->arraydata[i], right->arraydata[i]);\ - break;\ - cases\ + if(nested){\ + res = duparrayshape(left, AtypeArray);\ + for(int i = 0; i < left->size; i++){\ + Array *l = arrayitem(left, i);\ + Array *r = arrayitem(right, i);\ + res->arraydata[i] = name(l,r);\ + freearray(l);\ + freearray(r);\ }\ + }else{\ + res = duparray(left);\ + for(int i = 0; i < left->size; i++)\ + switch(left->type){\ + default: throwerror(nil, EType); break;\ + cases\ + }\ + }\ freearray(leftarr); freearray(rightarr); freearray(left); freearray(right);\ return res;} |