class HyperWhatever

Placeholder for multiple unspecified values/arguments
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.

The Camelia image is copyright 2009 by Larry Wall. "Raku" is a trademark of the Yet Another Society. All rights reserved.

Built with Podlite — the markup and publishing tools behind this site.