summaryrefslogtreecommitdiff
path: root/functions.c
diff options
context:
space:
mode:
Diffstat (limited to 'functions.c')
-rw-r--r--functions.c27
1 files changed, 24 insertions, 3 deletions
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);