class HyperWhatever
class HyperWhatever { }
HyperWhatever
is very similar in functionality to Whatever. The
difference lies in HyperWhatever
standing in for multiple values, rather
than a single one.
Standalone term
Just like with Whatever, if a
HyperWhatever
is used as a term on its own, no priming
is done and the HyperWhatever
object will be used as-is:
sub foo ($arg) { say $arg.^name }
foo **; # OUTPUT: «HyperWhatever»
You can choose to interpret such a value as standing for multiple values in your
own routines. In core, a HyperWhatever
can be used with
this meaning when smartmatching with Lists:
say (1, 8) ~~ (1, **, 8); # OUTPUT: «True»
say (1, 2, 4, 5, 6, 7, 8) ~~ (1, **, 8); # OUTPUT: «True»
say (1, 2, 8, 9) ~~ (1, **, 8); # OUTPUT: «False»
Wherever a HyperWhatever
appears in the list on the
right-hand side means any number of elements can fill that space in the list
being smartmatched.
Priming
When it comes to priming, the HyperWhatever
follows the
same rules as Whatever. The only difference is
HyperWhatever
produces a Callable with
a *@ slurpy as a signature:
say (**²)(1, 2, 3, 4, 5); # OUTPUT: «(1 4 9 16 25)»
A HyperWhatever
closure can be imagined as a
WhateverCode with another sub wrapped around it
that simply maps each element in the arguments over:
my &hyper-whatever = sub (*@args) { map *², @args }
say hyper-whatever(1, 2, 3, 4, 5); # OUTPUT: «(1 4 9 16 25)»
When priming, mixing HyperWhatever
with
Whatever is not permitted.