diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-17 22:31:00 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-17 22:31:00 +0000 |
commit | 0ef01858ce7685cb2faac5a2cddc6a2fd76de104 (patch) | |
tree | 9d41644d94d99d83f992451237a2144dffa22233 | |
parent | a36a6bcd305806536230995599d69e1f30ccbab0 (diff) |
Implement monadic ⌽ and ⊖
-rw-r--r-- | apl9.h | 2 | ||||
-rw-r--r-- | functions.c | 44 |
2 files changed, 44 insertions, 2 deletions
@@ -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 * |