In Parameter§
See primary documentation in context for method raw
method raw(Parameter:D: --> Bool:D)
Returns True
for raw parameters.
sub f($a, $b is raw, \c) { my $sig = &?ROUTINE.signature; for ^$sig.params.elems { say $sig.params[$_].raw; } } f(17, "4711", 42); # OUTPUT: «FalseTrueTrue»
Raw parameters bind either a variable or a value passed to it, with no decontainerization taking place. That means that if a variable was passed to it, you can assign to the parameter. This is different from rw-parameter which can only bind to variables, never to values.
This is the normal behavior for parameters declared with a sigil of '\
', which is not really a sigil insofar as it is only used on the parameter.
sub f(\x) { x = 5; } f(my $x); # works f(42); # dies CATCH { default { put .^name, ': ', .Str } }; # OUTPUT: «X::Assignment::RO: Cannot modify an immutable Int»
Other parameters may become raw through use of the 'is raw
' trait. These still use their sigil in code.
sub f($x is raw) { $x = 5; }
When used with slurpy list parameters, the is raw
trait will cause the list of arguments given to be packed into a List
instead of an Array
, which prevents them from being containerized with Scalar
. This is the default behavior when using +
with a sigilless parameter:
my @types is List = Mu, Any; say -> *@l { @l }(@types)[0] =:= @types[0]; # OUTPUT: «False» say -> +@l { @l }(@types)[0] =:= @types[0]; # OUTPUT: «False» say -> +l { l }(@types)[0] =:= @types[0]; # OUTPUT: «True» say -> *@l is raw { @l }(@types)[0] =:= @types[0]; # OUTPUT: «True»