From 22858219b44dcc483aecc40297cea28a02625972 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Fri, 28 Jan 2022 15:40:40 +0000 Subject: =?UTF-8?q?Implement=20membership=20(X=E2=88=8AY),=20excluding=20(?= =?UTF-8?q?X~Y)=20and=20union=20(X=E2=88=AAY)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apl9.h | 3 +++ eval.c | 2 +- functions.c | 27 ++++++++++++++++++++++++--- 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, /* ⍴ */ @@ -1136,6 +1136,27 @@ fnIndex(Array *left, Array *right) return result; } +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) { -- cgit v1.2.3