summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-17 22:31:00 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-17 22:31:00 +0000
commit0ef01858ce7685cb2faac5a2cddc6a2fd76de104 (patch)
tree9d41644d94d99d83f992451237a2144dffa22233
parenta36a6bcd305806536230995599d69e1f30ccbab0 (diff)
Implement monadic ⌽ and ⊖
-rw-r--r--apl9.h2
-rw-r--r--functions.c44
2 files changed, 44 insertions, 2 deletions
diff --git a/apl9.h b/apl9.h
index f6ea693..b96e793 100644
--- a/apl9.h
+++ b/apl9.h
@@ -200,6 +200,8 @@ Array *fnNest(Array *);
Array *fnIndexGenerator(Array *);
Array *fnRavel(Array *);
Array *fnShape(Array *);
+Array *fnReverseLast(Array *);
+Array *fnReverseFirst(Array *);
/* Dyadic functions from function.c */
Array *fnPlus(Array *, Array *);
diff --git a/functions.c b/functions.c
index 411f90b..ef9aa97 100644
--- a/functions.c
+++ b/functions.c
@@ -54,8 +54,8 @@ fnmonad monadfunctiondefs[] = {
fnRavel, /* , */
0, /* ⍪ */
fnShape, /* ⍴ */
- 0, /* ⌽ */
- 0, /* ⊖ */
+ fnReverseLast, /* ⌽ */
+ fnReverseFirst, /* ⊖ */
0, /* ⍉ */
0, /* ⍎ */
0, /* ⍕ */
@@ -226,6 +226,46 @@ fnShape(Array *right)
return res;
}
+Array *
+fnReverseLast(Array *right)
+{
+ if(right->rank < 1)
+ return fnSame(right);
+
+ Array *res = duparray(right);
+
+ int nrows = 1;
+ int rowsize = res->shape[res->rank-1];
+ for(int i = 0; i < res->rank - 1; i++)
+ nrows *= res->shape[i];
+
+ for(int row = 0; row < nrows; row++){
+ for(int i = 0; i < rowsize; i++)
+ memcpy(
+ res->rawdata + (row * rowsize + i) * datasizes[res->type],
+ right->rawdata + ((1+row) * rowsize - 1 - i) * datasizes[res->type],
+ datasizes[res->type]);
+ }
+ return res;
+}
+
+Array *
+fnReverseFirst(Array *right)
+{
+ if(right->rank < 1 || right->shape[0] == 0)
+ return fnSame(right);
+
+ Array *res = duparray(right);
+ int cells = res->shape[0];
+ int elems = res->size / cells;
+ for(int i = 0; i < cells; i++)
+ memcpy(
+ res->rawdata + i * elems * datasizes[res->type],
+ right->rawdata + (cells - 1 - i) * elems * datasizes[res->type],
+ datasizes[res->type] * elems);
+ return res;
+}
+
/* Dyadic functions */
Array *