Skip to content

Commit 73200f8

Browse files
committed
Document routine trait rw
1 parent bf9e77e commit 73200f8

File tree

1 file changed

+52
-1
lines changed

1 file changed

+52
-1
lines changed

lib/Type/Routine.pod

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,60 @@ Calculating 43th prime
9191
191
9292
=end code
9393
94+
=head2 trait is pure
95+
96+
multi sub trait_mod:<is>(Routine $r, :!$pure)
97+
98+
Marks a subroutine as I<pure>, that is, it asserts that for the same input, it
99+
will always produce the same output without any additional side effects.
100+
101+
This is a hint to the compiler that it can constant-fold calls to such
102+
functions when the arguments are known at compile time.
103+
104+
sub double(Numeric:D $x) is pure {
105+
2 * $x;
106+
}
107+
108+
=head2 trait is rw
109+
110+
multi sub trait_mod:<is>(Routine $r, :!$rw)
111+
112+
When a routine is modifies with this trait, its return value will be writable.
113+
This is useful when returning variables or writable elements of hashes or
114+
arrays, for example:
115+
116+
=begin code
117+
sub walk(\thing, *@keys) is rw {
118+
my $current := thing;
119+
for @keys -> $k {
120+
if $k ~~ Int {
121+
$current := $current[$k];
122+
}
123+
else {
124+
$current := $current{$k};
125+
}
126+
}
127+
$current;
128+
}
129+
130+
my %hash;
131+
walk(%hash, 'some', 'key', 1, 2) = 'autovivified';
132+
133+
say %hash.perl;
134+
=end code
135+
136+
produces
137+
138+
=begin code
139+
("some" => {"key" => [Any, [Any, Any, "autovivified"]]}).hash
140+
=end code
141+
142+
Note that C<return> marks return values as read only; if you need an early
143+
exit from an C<is rw> routine, you have to use C<return-rw> instead.
144+
94145
=begin comment
95146
96-
TODO: traits hidden_from_backtrace, pure, export, rw, DEPRECATED
147+
TODO: traits hidden_from_backtrace, export, DEPRECATED
97148
98149
=end comment
99150

0 commit comments

Comments
 (0)