################
# Index macros #
################
F! ← ^0 5
G! ← F!^0
⍤⤙≍ ¯5 G!¯
Four! ← ∩∩^0
⍤⤙≍ [4 6 8 10] [Four!(×2) 2 3 4 5]
Dyad‼ ← ^0^1
⍤⤙≍ 12 Dyad‼(×2|+1) 5
F‼‼ ← ^1^0^2^2^3^0
⍤⤙≍ [1 0 2 2 3 0] F‼‼(⊂0|⊂1|⊂2|⊂3) []
F! ← (
^0
^0
)
⍤⤙≍ 6 F!+ 1 2 3
F! ← [
^0
^0
]
⍤⤙≍ [6] F!+ 1 2 3
F! ← ⨬(
^0
| ^0
)
⍤⤙≍ ¯5 F!¯ 0 5
F! ← -^0 i
⍤⤙≍ i F!0
# Scoping shenanigans
┌─╴M
X ← "Inner"
A! ← ^0
B! ← (^0)
└─╴
X ← "Outer"
⍤⤙≍ "Outer" M~A!X
⍤⤙≍ "Outer" M~B!X
┌─╴Mod
X ← "Inner"
Mac₁! ← ^0
Mac₂! ← Mac₁!^0
└─╴
X ← "Outer"
⍤⤙≍ "Outer" Mod~Mac₁!X
⍤⤙≍ "Outer" Mod~Mac₂!X
┌─╴Module
Func ← (5)
└─╴
Macro! ← Module!^0
⍤⤙≍ 5 Macro!Func
┌─╴Mod
X ← "Stuff"
└─╴
Mac! ← ^0
⍤⤙≍ "Stuff" Mac!Mod!X
┌─╴M
X ← 5
F! ← +X ^0
└─╴
X ← 3
⍤⤙≍ 8 M~F!X
┌─╴Mod
Func ↚ +1
Mac! ← ^0 Func
└─╴
⍤⤙≍ 14 Mod~Mac!×₂ 6
┌─╴M
Ex ~ "example"
G‼ ← ×^1 Ex~Increment ^0
G! ← G‼^0 2
└─╴
⍤⤙≍ 12 M~G!5
┌─╴M ~ B!
X ← 15
B! ← ⟜₂(+X^)
└─╴
⍤⤙≍ [1 2 18] [B!+ 1 2]
###############
# Code macros #
###############
F! ←^
G! ←^ ⇌
H‼ ←^ ⊂⊸⊢
⍤⤙≍ [1 2] F!(⊂1|⊂2) []
⍤⤙≍ [2 1] G!(⊂1|⊂2) []
⍤⤙≍ [1 1 2] H‼(⊂1|⊂2) []
⍤⤙≍ [1 1 2] H‼(⊂1)(⊂2) []
X ← 1
F! ←^ ⊂□°⋕X
⍤⤙≍ [1 2] [F!2]
F‼ ←^ $"_ ← _\n" °⊟
F‼Y5
⍤⤙≍ 5 Y
Foo! ←^ "t ←rand" ◌
Hi ← Foo!+"a"
⍤⤙≍ "a" Hi
a ← 4
b ← (⚂)
c ← comptime(⚂)
e ← gen [] 1
A! ←^ $"_" a ◌
B! ←^ $"_" b ◌
C! ←^ $"_" c ◌
E! ←^ $"_" e ◌
◌A!1
◌B!2
◌C!3
◌E!5
◌E!5 # Ensure evaluated constant is set
F! ←^ {"+" "1"}◌
⍤⤙≍ [2 3 4] ≡F!∘ [1 2 3]
Struct‼ ←^ $"---_\n_\n---" ⊙(
/$"_\n_"⊂□$"New ← {_}"≡⋅@⊙⟜⍚$"_ ← °□⊡_"°˜⊏⊜□⊸≠@ °$"[_]"
)°{⊙∘}
Struct‼Person[Name Age][] # Ensure that a word on the same line as binding generation works
◌◌Person~New "Dave" 15
F‼ ←^
⍤⤙≍ [1 2 3] [F‼(1|2|3)]
M! ←^ ⋅"∘"
@a @b
⍤⤙≍ "b" [⋅M!∘]
Join! ←^ ↯⊙@⊂↥0-1⋕
{Join!0 "a" "bc" "def"}
{Join!1 "a" "bc" "def"}
{Join!2 "a" "bc" "def"}
◌◌◌
M! ←^ ˜⊂□"5" ⍚$"_ ←\n" °{$"[_]"/$"_ _"}
⇡3
⍤⤙≍ 5 M![A B C]
⍤⤙≍ ⇡3 A
⍤⤙≍ [] B []
⍤⤙≍ [] C []
M! ←^ /$"_\n_" ⊂□$"°⊟_"+@₀-@0°⋕⊸⧻ ⍚$"_ ← " °{$"[_]"/$"_ _"}
⇡3
M![D E F]
⍤⤙≍ [0] [D]
⍤⤙≍ [1] [E]
⍤⤙≍ [2] [F]
M![G H I] ⇡3
⍤⤙≍ [0] [G]
⍤⤙≍ [1] [H]
⍤⤙≍ [2] [I]
# Macro arg validation should ignore error from code macro args
┌─╴Wup
X ← 5
└─╴
A! ←^ $"Wup!(_)" ⊢
B! ← A!X ^0
⍤⤙≍ 5 B!()
# Modules should overwrite macros
Foo! ←^ repr⊢
┌─╴Foo
X ← 5
└─╴
⍤⤙≍ 5 Foo!(X)
# Macros use correct identifiers
┌─╴M ~ F!
X ← 5
F! ← +X^0
└─╴
X ← 3
⍤⤙≍ 8 F!X
# Inline macros
⍤⤙≍ [1 2 1 2] (^0^1^0^1)‼(⊂1|⊂2) []
⍤⤙≍ ≡⊂¤1_2_1_2 ⟜≡(^0^1^0^1)‼(⊂1|⊂2) [3 4 5]
⍤⤙≍ 12 (
^0
+1
×2
)!5
F ← 5
⍤⤙≍ 5 (^0)!F
F! ←^ (
G ← 5
⋅G
)
⍤⤙≍ 5 F!+
# These just need to parse
A₇₂₇! ← ^0
A⌞! ← ^0