NAME

Whatever - a perl6ish whatever-star for perl5

VERSION

Version 0.23

SYNOPSIS

this module provides a whatever-star * term for perl 5. since this module is not a source filter, the name &* or $* is as close as it's going to get.

use Whatever;

my $greet = 'hello, ' . &* . '!';

say $greet->('world'); # prints 'hello, world!'

what was:

my $result = $someobj->map(sub{$_ * 2});

can now be:

my $result = $someobj->map(&* * 2);

EXPORT

&*  the whatever-star
$*  the whatever-star         ($* is deprecated in 5.10+, so I'm taking it)
&@  the gets-val-from-@_-star
&_  the gets-val-from-$_-star

like all punctuation variables, the whatever terms are global across all packages after this module is loaded.

SUBROUTINES

the &* and $* stars are the most generic terms, which return their expression as a coderef that will take its argument from $_[0] if it is available, or $_ otherwise. this allows the terms to dwim in most contexts. think of the whatever star as sub {@_ ? $_[0] : $_}

the &@ term always uses $_[0], while the &_ always uses $_

beyond where they get their eventual argument from, all of the whatever terms behave the same way. each is a sticky overloaded object that will bind to the operators and variables that it interacts with. at all times the whatever star is a coderef that will perform the actions it has accumulated when passed a value to act on.

a few more examples are probably in order:

hello world
my $greet = "hello, $*!";  # the $* term interpolates in strings
say $greet->('world'); # prints 'hello, world!'

say "hello, $*!"->('world');
simple operations
my $inc = $* + 1;
say $inc->(5); # prints 6

my $inc_x2 = $inc * 2;  # whatever code continues to capture operations
say $inc_x2->(5); # prints 12

my $inc_inc = $inc->($inc); # and is fine with recursion
say $inc_inc->(5); # prints 7

my $repeat = &* x &*;
my $line = $repeat->('-');
my $hr = $line . "\n";

print $hr->(80);  # prints ('-' x 80)."\n"
with object oriented code

assuming this simple Array implementation:

{package Array;
    sub new  {shift; bless [@_]}
    sub map  {new Array map  $_[1]() => @{$_[0]}}
    sub grep {new Array grep $_[1]() => @{$_[0]}}
    sub str  {join ' ' => @{$_[0]}}
}
my $array = new Array 1 .. 10;

say $array->map(&_ * 2)->str;              # '2 4 6 8 10 12 14 16 18 20'
say $array->map(&_ * 2)->map(&_ + 1)->str; # '3 5 7 9 11 13 15 17 19 21'
say $array->map(&_ * 2 + 1)->str;          # '3 5 7 9 11 13 15 17 19 21'
method calls
my $str = &*->str;
say $str->($array); # prints '1 2 3 4 5 6 7 8 9 10'

my $multi_call = &*->map(&_ * 2 + 1)->grep(&_ % 5)->str;

say $multi_call->($array); # prints '3 7 9 11 13 17 19 21'

$some_obj->map(&*->some_method(...));

arguments of method calls are copied by alias if Array::RefElem is installed. this provides closure like behavior. otherwise, the values are fixed to whatever they were at the time of declaration.

multiple whatever stars

when working with subs created by combining multiple stars, you can bind multiple values at once by passing multiple arguments.

my $join3 = &* . &* . &*;

say $join3->(1)(2)(3); # prints '123'
say $join3->(1 .. 3);  # prints '123'

my $indent = $join3->(' ', ' ');

say $indent->('xyz'); # prints '  xyz'
arrays and hashes

you can dereference a whatever star as an array or hash (of course the star expects to be passed a suitable reference):

my $first = &*->[0];
my $bob   = &*->{bob};

say $first->([3 .. 5]); # prints '3'
say $bob->({bob => 5}); # prints '5'

the subroutine returned by the star is a valid lvalue (can be assigned to). multi-level calls and calls that would normally autovivify behave as expected.

&*->[0][0]{x}(my $array) = 4;

say $$array[0][0]{x}; # prints '4'
variables

the stars lazily bind to variables, which allows the variable to get its value after the star is defined, and to change its value between calls. this is analogous to an anonymous sub closing over a variable

my $future;
my $delorean = $future . (' ' . $* . '!');
 # works like: sub {$future . (' ' . $_[0] . '!')};

$future = 1.21;
say $delorean->('gigawatts'); # prints "1.21 gigawatts!"

$future = &*;
say $delorean->('folks')->("that's all");  # prints "that's all folks!"

AUTHOR

Eric Strom, <asg at cpan.org>

BUGS

this module is new, there are probably some.

please report any bugs or feature requests to bug-whatever at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Whatever. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

ACKNOWLEDGEMENTS

those behind the perl6 whatever-star

LICENSE AND COPYRIGHT

copyright 2010 Eric Strom.

this program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.

see http://dev.perl.org/licenses/ for more information.