diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-28 18:59:37 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-28 18:59:37 +0000 |
commit | be9919478aafcfa21957256d4f549059bc5ebc25 (patch) | |
tree | 60ac163504932b543dff4b1af137359609cddd82 | |
parent | 22858219b44dcc483aecc40297cea28a02625972 (diff) |
Implement where (⍸), unique mask (≠) and unique (∪)
-rw-r--r-- | apl9.h | 3 | ||||
-rw-r--r-- | functions.c | 24 |
2 files changed, 24 insertions, 3 deletions
@@ -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) |