develooper Front page | perl.perl6.users | Postings from January 2019

Re: **@args question

Thread Previous | Thread Next
From:
ToddAndMargo via perl6-users
Date:
January 3, 2019 06:18
Subject:
Re: **@args question
Message ID:
391381e0-c705-07c3-4188-117f058c68df@zoho.com
 > On Wed, Jan 2, 2019 at 8:41 PM ToddAndMargo via perl6-users
 > <perl6-users@perl.org> wrote:
 >>
 >> Hi All,
 >>
 >> Looking at
 >>
 >>      https://docs.perl6.org/routine/print
 >>
 >> I see
 >>
 >>      multi sub print(**@args --> True)
 >>
 >> Question.  If I wanted to create my own print routine
 >> using **@args, how would I declare it?
 >>
 >>      sub printx( **@args data ) {...}
 >>
 >>
 >> Many thanks,
 >> -T


On 1/2/19 10:06 PM, Brad Gilbert wrote:
> The variable name in :(**@args) is @args, it could be any valid array
> identifier like @data
> 
>      sub printx( **@data ){…}
> 
> Note that there are several forms for slurpy positional arguments.
> 
>      :(   @a ) # not slurpy at all, takes one Positional argument and
> aliases it as @a.
> 
>      :(  *@a ) # flattening slurpy  (1,),2,3 → 1,2,3 and ((1,),2,3) → 1,2,3
>      :( **@a ) # structured slurpy (1,),2,3 → (1,),2,3 and ((1,),2,3) →
> ((1,),2,3) # note there is no change
>      :(  +@a ) # one-arg rule slurpy (1,),2,3 → (1,),2,3 and ((1,),2,3)
> → (1,),2,3 # note that the second one changes
> 
> Note that itemized values do not get flattened for :(*@a), and that
> Array values are itemized.
> 
> I like to consider the one-arg rule slurpy :(+@a) to be like a
> combination between non-slurpy :(@a) and structured slurpy :(**@a)
> That is a one-arg rule slurpy will sometimes be like an alias to a
> singular positional, otherwise it will act like a structured slurpy.
> 
> Note that all but the [aliasing] non-slurpy :(@a) are [almost] always Array's.
> 
> ---
> 
> The one-arg rule slurpy is the oddest one of the bunch so here is some
> brief information:
> 
> The one-arg rule slurpy can be sigiless :(+a), in which case it will
> be a List instead of an Array or an alias to the single argument
> depending on what it was.
> 
>      sub one-arg-rule ( +args ){
>          say args.^name, " # ", args.perl;
>      }
> 
>      one-arg-rule(  (1,),2,3  ); # List # ((1,), 2, 3)
>      one-arg-rule( ((1,),2,3) ); # List # ((1,), 2, 3) # one-arg rule
>      one-arg-rule( ((1,),2,3).Seq ); # Seq # ((1,), 2, 3).Seq # one-arg rule
>      one-arg-rule(  1..3   ); # List # (1, 2, 3)
>      one-arg-rule( (1..3,) ); # List # (1..3,)
> 
>      sub one-arg-Array ( +@args ){
>          say @args.^name, " # ", @args.perl;
>      }
> 
>      one-arg-Array(  (1,),2,3  ); # Array # [(1,), 2, 3]
>      one-arg-Array( ((1,),2,3) ); # Array # [(1,), 2, 3]
>      one-arg-Array( ((1,),2,3).Seq ); # List # ((1,), 2, 3)
>      one-arg-Array(  1..3   ); # Array # [1, 2, 3]
>      one-arg-Array( (1..3,) ); # Array # [1..3,]
> 
> The one-arg rule exists because people tend to write the following:
> 
>      my @a = [1,2,3];
> 
> When the correct way to write it is:
> 
>      my @a = 1,2,3;
> 
> There are various other places where the one-arg rule is also used, so
> it was made available to everyone.
> 
> ---
> 
> Don't get too flustered if you don't understand all of the nuances, it
> take everybody a while to understand them.
> 

Thank you!

The term "slurpy" did help a lot.

:-)

I am writing your explanation down for my records.

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About