Matt Follett

Perl 6 - Whatever

***UPDATE: Carl Mäsak (@carlmasak) was kind enough to let me know that Whatever is simply a term. ***

The specifications for Perl 6 define the Whatever term, which is just an asterisk (*).  The Whatever term basically means “I don’t care, you decide.”  This breaks down to some slightly different meanings in different contexts.

As a Parameter

The Whatever term can be used by passing it as a parameter in a function, e.g. `bless( *, |%my_Data)`.  In the case where it is a parameter passed into the method it is telling the method, “I don’t know or care, so whatever you think is best.”  This may seem strange, but this is actually very similar to default values in other languages (and Perl 6), but is more powerful.  

This is more powerful than default values you see in other languages for two reasons. The first reason is that the Whatever term can appear anywhere in the parameter list.  This means that API designers don’t have to guess their most commonly defaulted parameters and then put them at the end, they can put them in the order that makes the most sense. The second reason is that Whatever can be more powerful than a default.  Since methods receive your Whatever they can hold on to it and do a little bit of reasoning to determine what it is you probably want before it replaces your Whatever.  This is unlike defaults which are set at the top of the function.  Here is an example usage with bless:

Any.bless( *, { foo => 'bar', baz => 'bax' });
view raw gistfile1.pl hosted with ❤ by GitHub

In this case bless will return back an object of type Any because bless decides to use the type of the object that called this. 

Of course, it is important to know how this works.  When you pass in ‘*’ as a parameter to a method the method gets back an object of type Whatever.  This effectively signals to the called method that it can do whatever it wants with that parameter.

In a statement

When you provide the Whatever term inside of a statement that statement is closed over, replacing your Whatever term with a variable that will be passed in to the new anonymous function.  So, for example, were you to provide:

my $foo = 1 + *
view raw gistfile1.pl hosted with ❤ by GitHub

You would find $foo holds something like:

sub { 1 + $^x }
view raw gistfile1.pl hosted with ❤ by GitHub

Which you could then use like this:

$foo(11).say() # 12
view raw gistfile1.txt hosted with ❤ by GitHub

You can also use it for a method call, like this:

my $x = *.frob(11);
view raw gistfile1.pl hosted with ❤ by GitHub

In this case $x basically holds something like:

sub { $^x.frob(11) };
view raw gistfile1.pl hosted with ❤ by GitHub

Specific Uses

The Whatever term has some very specific uses when it is provided in some cases:

1..* # a list 1 to infinity
@array[*] # all the elements in the list
(*, *, $x) = (1,2,3) # $x = 3, 1 & 2 are discarded. This is similar to (undef, undef, $x) = (1,2,3) in Perl5
%hash{*} # all the values in the hash
view raw gistfile1.pl hosted with ❤ by GitHub

Further Reading

If you would like to read more on the Whatever term you should look through Synopsis 2-Bits and Pieces where this is defined.