The * * * call generates a WhateverCode block. This is expecting 2
arguments.

-> $x { $x * $x } is taking one argument.

The best documentation would probably be :
https://docs.raku.org/type/Whatever

Hope that helps.

(For giggles earlier I made this dumb example of functional programming)


my &ident = {$_};
my &sq = {$_ * $_};
sub trinar( &test, &true, &false, *@values ) { @values.map( -> $v {
&test($v) ?? &true($v) !! &false($v) } ) };
trinar( *.is-prime, &sq,&ident, ^30 ).say

Enjoy. ;)

On Tue, 11 Feb 2020 at 15:22, Andy Bach <andy_b...@wiwb.uscourts.gov> wrote:

> I have a few less related questions
> >> those are 3 ways to write the same sub:
>
>     sub foo ($x) { $x * $x }
>     my &foo = -> $x { $x * $x }
>     my &foo = * * *;
>
> > A Note on Marc's comment:
> my &foo = * * *
> is not the same as:
> my &foo = -> $x { $x * $x }
> it is the same  as:
> my &foo = -> $x, $y { $x * $y }
>
> Okay, "* * *" - how does that work?  How is it different than
> -> $x { $x * $x }
> ?  It needs two params?
>
> I followed the callable link but that left me with more questions:
>
> method CALL-ME
> method CALL-ME(Callable:D $self: |arguments)
> This method is required for postfix:«( )» and postfix:«.( )». It's what
> makes an object actually call-able and needs to be overloaded to let a
> given object act like a routine. If the object needs to be stored in a
> &-sigiled container, is has to implement Callable.
>
> class A does Callable {
>     submethod CALL-ME(|c){ 'called' }
> }
> my &a = A;
> say a(); # OUTPUT: «called␤»
>
> That second "postfix" operator, means
> say a.();  # also outputs "called"
>
> but what is the "pipe c" signature doing for the submethod?
> ------------------------------
> *From:* Simon Proctor <simon.proc...@gmail.com>
> *Sent:* Tuesday, February 11, 2020 3:17 AM
> *To:* ToddAndMargo <toddandma...@zoho.com>
> *Cc:* perl6-users <perl6-us...@perl.org>
> *Subject:* Re: variable as subroutine?
>
> If you can store a subroutine in a variable then you can pass said
> subroutine to another one as an argument.
>
> This leads us into the joys of functional programming.
>
> And you may have used it already and not even realised.
>
> The .map and .grep methods (and .reduce and bunch of others) all expect a
> callable code block (that might be a subroutine) as a function.
>
> This :
>
> my @a = (1..10).map( * ** 2 )
>
> and this :
>
> my &sq = sub ($v) { $v ** 2 };
> my @a = (1..10).map( &sq );
>
> are doing the same thing. Except the second one has the &sq function
> available for other things.
>
> (A Note on Marc's comment * * * is not the same as -> $x { $x * $x } it is
> the same  as -> $x, $y { $x * $y } )
>
> You can then start doing things like storing functions as values in hashes
> and doing all *kinds* of fun stuff.
>
> Welcome to the tip of the iceberg.
>
> Simon
>
>
> On Tue, 11 Feb 2020 at 03:21, ToddAndMargo via perl6-users <
> perl6-us...@perl.org> wrote:
>
> Hi All,
>
> Is Larry using his magic powder again?
>
> Can I declare a subroutine as a variable?
>
>      my $abc = my sub (UInt $u, Str $s, Int $I) {
>
> How would I use it?
>
> And why would do such a thing?
>
> -T
>
>
>
> --
> Simon Proctor
> Cognoscite aliquid novum cotidie
>
> http://www.khanate.co.uk/
>


-- 
Simon Proctor
Cognoscite aliquid novum cotidie

http://www.khanate.co.uk/

Reply via email to