> Though I've no idea what those colons are/are not doing.

Those are "colon pairs" (which I've relearned around three times now...):

   https://docs.raku.org/language/glossary#index-entry-Colon_Pair

Except for this colon:

  %stash.append: (rocks => @rocks);

Which is a short hand for this:

  %stash.append( (rocks => @rocks) );

As an aside: it's a minor style point, but I think a lot of
us overuse that trick-- it saves a character, but the explicit
parens are more flexible.

Notably this works fine, so here it doesn't even save any
characters:

  %stash.append( :@stuff );


On 3/16/20, Andy Bach <andy_b...@wiwb.uscourts.gov> wrote:
> Vadim clarified for us, off-list:
>> So, you basically needed:
> my %h = :a(1); %h.append: (:b(2));
>
>> Am I correct?
> I think so, I mean, I believe the append method(?) for hashes would solve
> the problem the "whatever star" was attempted to be used for - so:
>> my @monsters = << godzilla grendel wormface blob fingfangfoom tingler >>;
> [godzilla grendel wormface blob fingfangfoom tingler]
>> my @rocks = << marble sandstone granite chert pumice limestone >>
> [marble sandstone granite chert pumice limestone]
>> my  %stash = monsters => @monsters
> {monsters => [godzilla grendel wormface blob fingfangfoom tingler]}
>>  %stash.append: (:rocks(@rocks));
> {monsters => [godzilla grendel wormface blob fingfangfoom tingler], rocks =>
> [marble sandstone granite chert pumice limestone]}
> Or:
>> my  %stash = monsters => @monsters
> {monsters => [godzilla grendel wormface blob fingfangfoom tingler]}
>> %stash.append: (:rocks => @rocks);
> {monsters => [godzilla grendel wormface blob fingfangfoom tingler], rocks
> True => [marble sandstone granite chert pumice limestone]}
> Or:
>> my  %stash = monsters => @monsters
> {monsters => [godzilla grendel wormface blob fingfangfoom tingler]}
>> %stash.append: (rocks => @rocks);
> {monsters => [godzilla grendel wormface blob fingfangfoom tingler], rocks =>
> [marble sandstone granite chert pumice limestone]}
>
> Though I've no idea what those colons are/are not doing.  And we can get to
> those "inner" array elements via
>> say %stash<rocks>[1]
> sandstone
>
>
>
> ________________________________
> From: Vadim Belman <vr...@lflat.org>
> Sent: Friday, March 13, 2020 12:50 PM
> To: Andy Bach <andy_b...@wiwb.uscourts.gov>
> Cc: William Michels via perl6-users <perl6-users@perl.org>; Joseph Brenner
> <doom...@gmail.com>; Timo Paulssen <t...@wakelift.de>; yary
> <not....@gmail.com>
> Subject: Re: stashing an array in a hash and yanking it back out
>
>
> There is no mystery whatsoever.
>
> Consider the following:
>
> my %h = "a", 1; # {a => 1}
>
> Then consider this:
>
> say *, *; # **
>
>
> and also:
>
> say *.VAR.WHAT; # (Whatever)
>
> Taking into account that => has tighter precedence than , what you get in:
>
> my %h = *, a => [1,2,3];
>
> is actually the following data structure:
>
> %( Whatever => Pair )
>
> Regarding your use of postcircumfix [ ] on the data, you use it on Pair.
>
> Best regards,
> Vadim Belman
>
> On Mar 13, 2020, at 11:52 AM, Andy Bach
> <andy_b...@wiwb.uscourts.gov<mailto:andy_b...@wiwb.uscourts.gov>> wrote:
>
>> my  %stash = monsters => @monsters, rocks => @rocks
> {monsters => [godzilla grendel wormface blob fingfangfoom tingler], rocks =>
> [marble sandstone granite chert pumice limestone]}
>> my @more_rocks = << marble sandstone granite chert pumice limestone >>
> [marble sandstone granite chert pumice limestone]
>> my  %stash = *, morerocks => @rocks
> {* => morerocks => [marble sandstone granite chert pumice limestone]}
>> say %stash{*}
> (morerocks => [marble sandstone granite chert pumice limestone])
>
> So, I'm guessing the display
> {* => morerocks => [marble sandstone granite chert pumice limestone]}
>
> really means something like
> {* => (morerocks => [marble sandstone granite chert pumice limestone])}
>
> maybe?
>> say @(%stash{*})
> (morerocks => [marble sandstone granite chert pumice limestone])
>> say @(%stash{*}).[0]
> morerocks => [marble sandstone granite chert pumice limestone]
>> say @(%stash{*}).[1]
> Nil
>> say @(%stash{*}).[0].{morerocks}
> ===SORRY!=== Error while compiling:
> Undeclared routine:
>     morerocks used at line 1
>
>> say @(%stash{*}).[0].[0]
> morerocks => [marble sandstone granite chert pumice limestone]
>> say @(%stash{*}).[0].[1]
> Index out of range. Is: 1, should be in 0..0
>   in block <unit> at <unknown file> line 1
>
>> say @(%stash{*}).[0].[0].perl
> :morerocks(["marble", "sandstone", "granite", "chert", "pumice",
> "limestone"])
>> say @(%stash{*}).[0].perl
> :morerocks(["marble", "sandstone", "granite", "chert", "pumice",
> "limestone"])
>
>
> I dunno.
>
> ________________________________
> From: William Michels via perl6-users
> <perl6-users@perl.org<mailto:perl6-users@perl.org>>
> Sent: Thursday, March 12, 2020 5:44 PM
> To: perl6-users <perl6-users@perl.org<mailto:perl6-users@perl.org>>
> Cc: Joseph Brenner <doom...@gmail.com<mailto:doom...@gmail.com>>; Timo
> Paulssen <t...@wakelift.de<mailto:t...@wakelift.de>>; yary
> <not....@gmail.com<mailto:not....@gmail.com>>
> Subject: Re: stashing an array in a hash and yanking it back out
>
> Thanks yary! The code you posted works perfectly.
>
> Okay, one last question. I tried to use the 'DRY' principle to add
> things to a hash. However, (thinking that a 'whatever star' might
> reduce typing), I came up with an odd "ternary" structure. Can anyone
> explain the last line of code, below?
>
> mbook:~ homedir$ perl6
> To exit type 'exit' or '^D'
>> my @monsters = << godzilla grendel wormface blob fingfangfoom tingler >>;
> [godzilla grendel wormface blob fingfangfoom tingler]
>> my @rocks = << marble sandstone granite chert pumice limestone >>
> [marble sandstone granite chert pumice limestone]
>> my  %stash = monsters => @monsters
> {monsters => [godzilla grendel wormface blob fingfangfoom tingler]}
>> my %stash = *, rocks => @rocks;
> {* => rocks => [marble sandstone granite chert pumice limestone]}
>
> Thanks, Bill.
>
>
> On Wed, Mar 11, 2020 at 9:06 PM yary
> <not....@gmail.com<mailto:not....@gmail.com>> wrote:
>>
>> The fat-arrow example makes sense, what this says
>> %stash = rocks => @rocks
>> is "replace %stash in its entirety with key rocks gets value @rocks"
>> anything that used to be in %stash doesn't matter because this assignment
>> (left side) is the entirety of %stash
>>
>> what this says
>> %stash{'rocks'} = @rocks
>> is "replace the slot 'rocks' in %stash with @rocks"
>> This assignment only is for the 'rocks' element of %stash so the other
>> elements remain unchanged.
>>
>> Extending the examples, first 3 lines are unchanged from before
>>
>> > my @monsters = << godzilla grendel wormface blob fingfangfoom tingler
>> > >>;
>> [godzilla grendel wormface blob fingfangfoom tingler]
>> > my @rocks = << marble sandstone granite chert pumice limestone >>
>> [marble sandstone granite chert pumice limestone]
>> > my  %stash = monsters => @monsters
>> {monsters => [godzilla grendel wormface blob fingfangfoom tingler]}
>>
>> > %stash = %stash, rocks => @rocks
>> {monsters => [godzilla grendel wormface blob fingfangfoom tingler], rocks
>> => [marble sandstone granite chert pumice limestone]}
>> > my %together = monsters => @monsters, rocks => @rocks
>> {monsters => [godzilla grendel wormface blob fingfangfoom tingler], rocks
>> => [marble sandstone granite chert pumice limestone]}
>>
>>
>> -y
>>
>>
>> On Tue, Mar 10, 2020 at 1:12 PM William Michels via perl6-users
>> <perl6-users@perl.org<mailto:perl6-users@perl.org>> wrote:
>>>
>>> Hi Joe,
>>>
>>> So I had a chance to play with hashes further, and I noticed something
>>> that you might be interested in. It seems that 'bare' declaration of a
>>> hash with a "my" lexical scope enables you to stash away multiple
>>> 'hash' elements at the top level using a 'curly brace' syntax. However
>>> using the 'fat arrow' syntax will overwrite any previously stashed
>>> 'top level' hash elements.
>>>
>>> Hopefully the REPL code below illustrates. First, 'curly brace' syntax:
>>>
>>> mbook:~ homedir$ perl6
>>> To exit type 'exit' or '^D'
>>> > my @monsters = << godzilla grendel wormface blob fingfangfoom tingler
>>> > >>;
>>> [godzilla grendel wormface blob fingfangfoom tingler]
>>> > my @rocks = << marble sandstone granite chert pumice limestone >>
>>> [marble sandstone granite chert pumice limestone]
>>> > my %stash
>>> {}
>>> > %stash{'monsters'} = @monsters
>>> [godzilla grendel wormface blob fingfangfoom tingler]
>>> > say %stash
>>> {monsters => [godzilla grendel wormface blob fingfangfoom tingler]}
>>> > %stash{'rocks'} = @rocks
>>> [marble sandstone granite chert pumice limestone]
>>> > say %stash
>>> {monsters => [godzilla grendel wormface blob fingfangfoom tingler],
>>> rocks => [marble sandstone granite chert pumice limestone]}
>>> > exit
>>> mbook:~ homedir$
>>>
>>> [and now try 'fat arrow' syntax]
>>>
>>> mbook:~ homedir$ perl6
>>> To exit type 'exit' or '^D'
>>> > my @monsters = << godzilla grendel wormface blob fingfangfoom tingler
>>> > >>;
>>> [godzilla grendel wormface blob fingfangfoom tingler]
>>> > my @rocks = << marble sandstone granite chert pumice limestone >>
>>> [marble sandstone granite chert pumice limestone]
>>> > my %stash
>>> {}
>>> > %stash = monsters => @monsters
>>> {monsters => [godzilla grendel wormface blob fingfangfoom tingler]}
>>> > %stash = rocks => @rocks
>>> {rocks => [marble sandstone granite chert pumice limestone]}
>>> > say %stash
>>> {rocks => [marble sandstone granite chert pumice limestone]}
>>> > say %stash<monsters>
>>> (Any)
>>> > exit
>>> mbook:~ homedir$ perl6 -v
>>> This is Rakudo version 2019.07.1 built on MoarVM version 2019.07.1
>>> implementing Perl 6.d.
>>>
>>> HTH, Bill.
>>>
>>>
>>>
>>> On Thu, Mar 5, 2020 at 6:10 PM Joseph Brenner
>>> <doom...@gmail.com<mailto:doom...@gmail.com>> wrote:
>>> >
>>> > William Michels <w...@caa.columbia.edu<mailto:w...@caa.columbia.edu>>
>>> > wrote:
>>> >
>>> > > Yes, since I was working in the REPL, I tried compacting Joe's code
>>> > > by
>>> > > eliminating the "my %stash" line at the top, and adding "my" to the
>>> > > third
>>> > > line.
>>> >
>>> > I noticed the additional "my" in there, but I wouldn't have been able
>>> > to tell you why it was behaving like it was...
>>> >
>>> > On the plus side, I see that if you tried to do that in a script, it
>>> > would warn you:
>>> >
>>> >     Potential difficulties:
>>> >        Redeclaration of symbol '%stash'
>
>

Reply via email to