From 3330e6ed47c71b87bb79c5e277214a36d3f2ad3b Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Fri, 14 Jan 2022 13:09:26 +0000 Subject: Add code to simplify arrays of nested scalars, sometimes created by functions or operators --- apl9.h | 1 + array.c | 19 +++++++++++++++++++ eval.c | 6 ++++++ 3 files changed, 26 insertions(+) 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]; -- cgit v1.2.3