In Code§
See primary documentation in context for method assuming
method assuming(Callable:D $self: |primers)
Returns a new Callable
that has been primed with the arguments passed to assuming
. In other words, the new function implements the same behavior as the original, but has the values passed to .assuming
already bound to the corresponding parameters.
my sub slow($n){ my $i = 0; $i++ while $i < $n; $i }; # takes only one parameter and as such wont forward $n sub bench(&c){ c, now - ENTER now }; say &slow.assuming(10000000).&bench; # OUTPUT: «(10000000 7.5508834)»
For a sub with arity greater than one, you can use Whatever
*
for all of the positional parameters that are not "assumed".
sub first-and-last ( $first, $last ) { say "Name is $first $last"; } my &surname-smith = &first-and-last.assuming( *, 'Smith' ); &surname-smith.( 'Joe' ); # OUTPUT: «Name is Joe Smith»
You can handle any combination of assumed and not assumed positional parameters:
sub longer-names ( $first, $middle, $last, $suffix ) { say "Name is $first $middle $last $suffix"; } my &surname-public = &longer-names.assuming( *, *, 'Public', * ); &surname-public.( 'Joe', 'Q.', 'Jr.'); # OUTPUT: «Name is Joe Q. Public Jr.»
Named parameters can be assumed as well:
sub foo { say "$^a $^b $:foo $:bar" } &foo.assuming(13, :42foo)(24, :72bar); # OUTPUT: «13 24 42 72»
And you can use .assuming
on all types of Callables, including Methods and Blocks:
# We use a Whatever star for the invocant: my &comber = Str.^lookup('comb').assuming: *, /P \w+/; say comber 'Perl is awesome! Python is great! And PHP is OK too'; # OUTPUT: «(Perl Python PHP)» my &learner = { "It took me $:months months to learn $^lang" }.assuming: 'Raku'; say learner :6months; # OUTPUT: «It took me 6 months to learn Raku»