develooper Front page | perl.perl6.users | Postings from March 2020

Re: stashing an array in a hash and yanking it back out

Thread Previous | Thread Next
From:
Andy Bach
Date:
March 16, 2020 22:44
Subject:
Re: stashing an array in a hash and yanking it back out
Message ID:
DM6PR09MB544829F8C0C5DCA46081FEF6C0F90@DM6PR09MB5448.namprd09.prod.outlook.com
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 <vrurg@lflat.org>
Sent: Friday, March 13, 2020 12:50 PM
To: Andy Bach <Andy_Bach@wiwb.uscourts.gov>
Cc: William Michels via perl6-users <perl6-users@perl.org>; Joseph Brenner <doomvox@gmail.com>; Timo Paulssen <timo@wakelift.de>; yary <not.com@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_Bach@wiwb.uscourts.gov<mailto:Andy_Bach@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 <doomvox@gmail.com<mailto:doomvox@gmail.com>>; Timo Paulssen <timo@wakelift.de<mailto:timo@wakelift.de>>; yary <not.com@gmail.com<mailto:not.com@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.com@gmail.com<mailto:not.com@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 <doomvox@gmail.com<mailto:doomvox@gmail.com>> wrote:
>> >
>> > William Michels <wjm1@caa.columbia.edu<mailto:wjm1@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'


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