Operators are declared by using the sub
keyword followed by prefix
, infix
, postfix
, circumfix
, or postcircumfix
; then a colon and the operator name in a quote construct. For (post-)circumfix operators separate the two parts by white space.
sub hello { say "Hello, world!"; } say &hello.^name; # OUTPUT: «Sub» hello; # OUTPUT: «Hello, world!» my $s = sub ($a, $b) { $a + $b }; say $s.^name; # OUTPUT: «Sub» say $s(2, 5); # OUTPUT: «7» # Alternatively we could create a more # general operator to sum n numbers sub prefix:<Σ>( *@number-list ) { [+] @number-list } say Σ (13, 16, 1); # OUTPUT: «30» sub infix:<:=:>( $a is rw, $b is rw ) { ($a, $b) = ($b, $a) } my ($num, $letter) = ('A', 3); say $num; # OUTPUT: «A» say $letter; # OUTPUT: «3» # Swap two variables' values $num :=: $letter; say $num; # OUTPUT: «3» say $letter; # OUTPUT: «A» sub postfix:<!>( Int $num where * >= 0 ) { [*] 1..$num } say 0!; # OUTPUT: «1» say 5!; # OUTPUT: «120» sub postfix:<♥>( $a ) { say „I love $a!“ } 42♥; # OUTPUT: «I love 42!» sub postcircumfix:<⸨ ⸩>( Positional $a, Whatever ) { say $a[0], '…', $a[*-1] } [1,2,3,4]⸨*⸩; # OUTPUT: «1…4» constant term:<♥> = "♥"; # We don't want to quote "love", do we? sub circumfix:<α ω>( $a ) { say „$a is the beginning and the end.“ }; α♥ω; # OUTPUT: «♥ is the beginning and the end.»
These operators use the extended identifier syntax; that is what enables the use of any kind of codepoint to refer to them.