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 ()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 List
s:
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 = sub (*)say hyper-whatever(1, 2, 3, 4, 5); # OUTPUT: «(1 4 9 16 25)»
When priming, mixing HyperWhatever
with Whatever
is not permitted.