summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-14 13:09:26 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-14 13:09:26 +0000
commit3330e6ed47c71b87bb79c5e277214a36d3f2ad3b (patch)
tree2e019b93bae58aef42d543332cce10dc706f43e7
parent396543790dc1c844c726b77a95c6180978232abd (diff)
Add code to simplify arrays of nested scalars, sometimes created by functions or operators
-rw-r--r--apl9.h1
-rw-r--r--array.c19
-rw-r--r--eval.c6
3 files changed, 26 insertions, 0 deletions
diff --git a/apl9.h b/apl9.h
index a2d0e3d..3317e3b 100644
--- a/apl9.h
+++ b/apl9.h
@@ -144,6 +144,7 @@ int simplescalar(Array *);
Array *extend(Array *, Array *);
int scalarextend(Array *, Array *, Array **, Array **);
Array *arrayitem(Array *, int);
+Array *simplifyarray(Array *);
/* eval.c */
Datum *eval(Statement *);
diff --git a/array.c b/array.c
index 4a14ab9..7675144 100644
--- a/array.c
+++ b/array.c
@@ -97,4 +97,23 @@ arrayitem(Array *a, int index)
exits(nil);
}
return res;
+}
+
+Array *
+simplifyarray(Array *a)
+{
+ /* simplify an array if possible. */
+ if(a->type != AtypeArray || a->size == 0)
+ return fnSame(a);
+ int type = a->arraydata[0]->type;
+ int i;
+ for(i = 0; i < a->size; i++)
+ if(a->arraydata[i]->type != type || a->arraydata[i]->rank != 0)
+ return fnSame(a);
+ Array *b = allocarray(type, a->rank, a->size);
+ for(i = 0; i < a->rank; i++)
+ b->shape[i] = a->shape[i];
+ for(i = 0; i < a->size; i++)
+ memcpy(b->rawdata + i * datasizes[type], a->arraydata[i]->rawdata, datasizes[type]);
+ return b;
} \ No newline at end of file
diff --git a/eval.c b/eval.c
index e7b0a13..b3efc05 100644
--- a/eval.c
+++ b/eval.c
@@ -112,6 +112,12 @@ retry:
if(stmt->toks[offset+1].tag == ArrayTag)
freearray(stmt->toks[offset+1].array);
+ if(new.tag == ArrayTag){
+ Array *tmp = new.array;
+ new.array = simplifyarray(tmp);
+ freearray(tmp);
+ }
+
stmt->toks[offset] = new;
for(int i = offset+1; i < stmt->ntoks-1; i++)
stmt->toks[i] = stmt->toks[i+1];