My reply to Joseph went off the list too. I copy it over here. Here is the key
quote from Joseph's email I was answering to:
So doing that with append would be like this:
%stash.append: (:greek(@greek));
William Michels was wondering if there was a way to avoid
repeating the name twice, speculating that there might be
some way to do that with a 'whateva' *.
My answer follows:
Ok, clear enough. This is as simple as:
%stash.append: (:@greek);
Roughly, colon op doesn't care about sigils and twigils. It takes a symbol and
creates a pair with the key of the symbol. A good example with a bit of Raku
charm:
class Foo {
has @.attr = <a b c>;
method foo { %(:@.attr) }
}
say Foo.new.foo; # {attr => [a b c]}
Best regards,
Vadim Belman
> On Mar 16, 2020, at 6:44 PM, Andy Bach <[email protected]> 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 <[email protected]>
> Sent: Friday, March 13, 2020 12:50 PM
> To: Andy Bach <[email protected]>
> Cc: William Michels via perl6-users <[email protected]>; Joseph Brenner
> <[email protected]>; Timo Paulssen <[email protected]>; yary
> <[email protected]>
> 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 <[email protected]
>> <mailto:[email protected]>> 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 <[email protected]
>> <mailto:[email protected]>>
>> Sent: Thursday, March 12, 2020 5:44 PM
>> To: perl6-users <[email protected] <mailto:[email protected]>>
>> Cc: Joseph Brenner <[email protected] <mailto:[email protected]>>; Timo
>> Paulssen <[email protected] <mailto:[email protected]>>; yary
>> <[email protected] <mailto:[email protected]>>
>> 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 <[email protected]
>> <mailto:[email protected]>> 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
>> > <[email protected] <mailto:[email protected]>> 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 <[email protected]
>> >> <mailto:[email protected]>> wrote:
>> >> >
>> >> > William Michels <[email protected] <mailto:[email protected]>>
>> >> > 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'