summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-28 18:59:37 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-28 18:59:37 +0000
commitbe9919478aafcfa21957256d4f549059bc5ebc25 (patch)
tree60ac163504932b543dff4b1af137359609cddd82
parent22858219b44dcc483aecc40297cea28a02625972 (diff)
Implement where (⍸), unique mask (≠) and unique (∪)
-rw-r--r--apl9.h3
-rw-r--r--functions.c24
2 files changed, 24 insertions, 3 deletions
diff --git a/apl9.h b/apl9.h
index 2846861..2a7565f 100644
--- a/apl9.h
+++ b/apl9.h
@@ -294,6 +294,7 @@ Array *fnMagnitude(Array *);
Array *fnCeiling(Array *);
Array *fnFloor(Array *);
Array *fnSame(Array *);
+Array *fnUniqueMask(Array *);
Array *fnDepth(Array *);
Array *fnTally(Array *);
Array *fnMix(Array *);
@@ -304,7 +305,9 @@ Array *fnNest(Array *);
Array *fnGradeUp(Array *);
Array *fnGradeDown(Array *);
Array *fnIndexGenerator(Array *);
+Array *fnWhere(Array *);
Array *fnEnlist(Array *);
+Array *fnUnique(Array *);
Array *fnNot(Array *);
Array *fnRavel(Array *);
Array *fnTable(Array *);
diff --git a/functions.c b/functions.c
index ad87c11..3b32cca 100644
--- a/functions.c
+++ b/functions.c
@@ -25,7 +25,7 @@ fnmonad monadfunctiondefs[] = {
fnSame, /* ⊣ */
fnSame, /* ⊢ */
0, /* = */
- 0, /* ≠ */
+ fnUniqueMask, /* ≠ */
0, /* ≤ */
0, /* < */
0, /* > */
@@ -45,10 +45,10 @@ fnmonad monadfunctiondefs[] = {
fnGradeUp, /* ⍋ */
fnGradeDown, /* ⍒ */
fnIndexGenerator, /* ⍳ */
- 0, /* ⍸ */
+ fnWhere, /* ⍸ */
fnEnlist, /* ∊ */
0, /* ⍷ */
- 0, /* ∪ */
+ fnUnique, /* ∪ */
0, /* ∩ */
fnNot, /* ~ */
fnRavel, /* , */
@@ -367,6 +367,12 @@ fnSame(Array *right)
}
Array *
+fnUniqueMask(Array *right)
+{
+ return rundfn(L"(⍳≢⍵)≤⊃∘⍸¨↓≡⌾⍨⌷∘⍵¨⍳≢⍵", nil, nil, nil, right);
+}
+
+Array *
fnDepth(Array *right)
{
int uniform;
@@ -576,6 +582,12 @@ fnIndexGenerator(Array *right)
}
Array *
+fnWhere(Array *right)
+{
+ return rundfn(L"(,⍵)⌿,⍳⍴⍵", nil, nil, nil, right);
+}
+
+Array *
fnEnlist(Array *right)
{
if(right->size == 0)
@@ -596,6 +608,12 @@ fnEnlist(Array *right)
}
Array *
+fnUnique(Array *right)
+{
+ return rundfn(L"(≠⍵)⌿⍵", nil, nil, nil, right);
+}
+
+Array *
fnNot(Array *right)
{
if(right->type != AtypeInt)