summaryrefslogtreecommitdiff
path: root/hybrids.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-26 15:09:20 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-26 15:09:20 +0000
commit17e97bbed7abc59fb754cf463e825e890b16815d (patch)
tree3c3008e394311a05a221997c4b5575a3076d8f98 /hybrids.c
parent024867f3da16c7b51a768399401de1edcd417384 (diff)
Implement replicate first and last ⌿ /
Diffstat (limited to 'hybrids.c')
-rw-r--r--hybrids.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/hybrids.c b/hybrids.c
index 2ac2a91..da42e62 100644
--- a/hybrids.c
+++ b/hybrids.c
@@ -7,9 +7,9 @@
Rune primhybridnames[] = L"/\\⌿⍀";
fndyad hybridfunctiondefs[] = {
- 0, /* / */
+ fnReplicateLast, /* / */
0, /* \ */
- 0, /* ⌿ */
+ fnReplicateFirst, /* ⌿ */
0, /* ⍀ */
};
@@ -21,6 +21,22 @@ opmonad hybridoperatordefs[] = {
};
/* function definitions */
+Array *
+fnReplicateLast(Array *left, Array *right)
+{
+ return rundfn(L"⍉⍺⌿⍉⍵", nil, nil, left, right);
+}
+
+Array *
+fnReplicateFirst(Array *left, Array *right)
+{
+ Rune *code =
+ L"(0=≢⍴⍵)∧⍺∧.=0: 0⍴⍵ ⋄"
+ L"⍺∧.=0: (((1,¯1+≢⍴⍵)⌿¯1 1)⌿⍴⍵)⍴⍵ ⋄"
+ L"1=×⌿⍴,⍵: ↑⍪⌿(+⌿⍺)⍴⊂⍵ ⋄"
+ L"↑↑⍪⌿⍺ (⍵{e←⊂⍵⌷⍶ ⋄ ⍺>0: ⍺⍴e ⋄ (|⍺)⍴⎕PROTO e})¨⍳≢⍵";
+ return rundfn(code, nil, nil, left, right);
+}
/* operator definitions */
Array *