summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-28 15:40:40 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-28 15:40:40 +0000
commit22858219b44dcc483aecc40297cea28a02625972 (patch)
tree6431310fe8bfcf62a89fe4129bd42e6a9e7874b7
parent69d4a8f20cbc60bae27aef9a36857324a04c581f (diff)
Implement membership (X∊Y), excluding (X~Y) and union (X∪Y)
-rw-r--r--apl9.h3
-rw-r--r--eval.c2
-rw-r--r--functions.c27
3 files changed, 28 insertions, 4 deletions
diff --git a/apl9.h b/apl9.h
index 311bceb..2846861 100644
--- a/apl9.h
+++ b/apl9.h
@@ -340,6 +340,9 @@ Array *fnNand(Array *, Array *);
Array *fnNor(Array *, Array *);
Array *fnTake(Array *, Array *);
Array *fnIndex(Array *, Array *);
+Array *fnMembership(Array *, Array *);
+Array *fnUnion(Array *, Array *);
+Array *fnExcluding(Array *, Array *);
Array *fnCatenateLast(Array *, Array *);
Array *fnCatenateFirst(Array *, Array *);
Array *fnReshape(Array *, Array *);
diff --git a/eval.c b/eval.c
index 8829609..5a8d758 100644
--- a/eval.c
+++ b/eval.c
@@ -31,7 +31,7 @@ int bindingstrengths[11][11] = {
6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, /* DO */
3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* AF */
0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, /* ( */
- 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, /* ) */
+ 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, /* ) */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ← */
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* IS */
0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, /* N */
diff --git a/functions.c b/functions.c
index eedacb9..ad87c11 100644
--- a/functions.c
+++ b/functions.c
@@ -102,11 +102,11 @@ fndyad dyadfunctiondefs[] = {
0, /* ⍒ */
0, /* ⍳ */
0, /* ⍸ */
- 0, /* ∊ */
+ fnMembership, /* ∊ */
0, /* ⍷ */
- 0, /* ∪ */
+ fnUnion, /* ∪ */
0, /* ∩ */
- 0, /* ~ */
+ fnExcluding, /* ~ */
fnCatenateLast, /* , */
fnCatenateFirst, /* ⍪ */
fnReshape, /* ⍴ */
@@ -1137,6 +1137,27 @@ fnIndex(Array *left, Array *right)
}
Array *
+fnMembership(Array *left, Array *right)
+{
+ /* TODO avoid outer product */
+ return rundfn(L"∨/⍺≡⌾⍵", nil, nil, left, right);
+}
+
+Array *
+fnUnion(Array *left, Array *right)
+{
+ if(left->rank > 1 || right->rank > 1)
+ throwerror(nil, ERank);
+ return rundfn(L"⍺⍪⍵~⍺", nil, nil, left, right);
+}
+
+Array *
+fnExcluding(Array *left, Array *right)
+{
+ return rundfn(L"(~⍺∊⍵)⌿⍺", nil, nil, left, right);
+}
+
+Array *
fnCatenateLast(Array *left, Array *right)
{
return rundfn(L"⍉(⍉⍺)⍪⍉⍵", nil, nil, left, right);