summaryrefslogtreecommitdiff
path: root/functions.c
diff options
context:
space:
mode:
Diffstat (limited to 'functions.c')
-rw-r--r--functions.c39
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;}