The discussion took an interesting route. :)

The problem with an array in a hash is the problem of hashes implicitly 
itemizing values. Consider the example:

⇒ raku -e 'my %h = a => [1,2,3,4]; say %h<a>.raku; say (%h<a> ==> map({ sqrt $_ 
})); %h<a> := [1,2,3,4]; say %h<a>.raku; say (%h<a> ==> map({ sqrt $_ }))'
$[1, 2, 3, 4]
(2)
[1, 2, 3, 4]
(1 1.4142135623730951 1.7320508075688772 2)

Sorry for one-liner. The point of the example is that binding to a key avoids 
itemization of its RHS if it is a non-itemized object.

Because itemizing in fact means putting things into a Scalar container, then 
the fastest thing which resolves the issue with ==> would be de-containerize a 
value:

⇒ raku -e 'my %h = a => [1,2,3,4]; say %h<a>.raku; say (%h<a> ==> map({ sqrt $_ 
})); say (%h<a><> ==> map({ sqrt $_ }));'
$[1, 2, 3, 4]
(2)
(1 1.4142135623730951 1.7320508075688772 2)

<> here is the decontainerization operator. And it would be the fastest 
solution because most others are coercers meaning that the most likely outcome 
of .Slip, .List, pipe operator, etc. – would be creation of a new object. With 
<> we just pull out the Array from the container with no modifications or 
copying.

Note that I say nothing to justify the use of ==>. I simply don't use it.

Best regards,
Vadim Belman

> On Jul 14, 2021, at 8:13 PM, Brad Gilbert <b2gi...@gmail.com> wrote:
> 
> Honestly I would advise against using ==> at the moment.
> 
> For one thing it doesn't even work like it is intended.
> Each side of it is supposed to act like a separate process.
> 
> There are also issues with the syntax that are LTA.
> The fact that you have to tell it the left side is actually a list is one 
> such issue.
> 
> It isn't even all that clearer than just using a method call
> 
>     > %a<column1>         .map({.sqrt});
> 
> ---
> 
> Using 「.Slip」 or 「|」 prefix works, but is the wrong thing.
> You need to tell it that it is a list, so use 「.List」 or 「@(…)」
> 
>     > @(%a<column1>) ==> map({.sqrt})
>     > %a<column1>.List ==> map({.sqrt})
> 
> Since a Slip is a type of List, using it works, but for the wrong reasons.
> 
> 
> On Wed, Jul 14, 2021 at 2:58 PM Aureliano Guedes <guedes.aureli...@gmail.com 
> <mailto:guedes.aureli...@gmail.com>> wrote:
> thank
> 
> It is now more clear.
> And I like this notation |%a<column1> ==> map({.sqrt});
> less is more sometimes
> 
> 
> 
> On Wed, Jul 14, 2021 at 4:41 PM Daniel Sockwell <dan...@codesections.com 
> <mailto:dan...@codesections.com>> wrote:
> To expand slightly on what Clifton said, the reason that
> 
> > %a<column3> = %a<column1>.map: { .sqrt };
> > # (1 1.4142135623730951 1.7320508075688772 2 2.23606797749979)
> 
> does what you mean but 
> 
> > %a{'column1'} ==> map( { .sqrt } )
> > # (2.23606797749979)
> 
> does not is that the method .map maps over *each item* in the Array, whereas
> ==> map maps over the Array as *one collection*.  When taking the square root,
> an Array needs to be treated as an number, which for Raku means treating it 
> as 
> a count of how many elements it has (i.e., its length).
> 
> So `%a{'column1'} ==> map({.sqrt})` is the same as 
> `%a{'column1'}.elems.map({.sqrt})`
> 
> If want to map over each item in the Array when using the ==> operator, you 
> need to
> slip the items out of the Array before feeding them on.  You can do that with 
> either
> of the following (equivalent) lines:
> 
> > %a{'column1'}.Slip ==> map({.sqrt});
> > |%a{'column1>'}==> map({.sqrt});
> 
> (Also, you may already know this, but when the keys of your hash are strings, 
> you 
> can write %a<column1> instead of %a{'column1'}  )
> 
> Hope that helps!
> 
> –codesections
> 
> 
> -- 
> Aureliano Guedes
> skype: aureliano.guedes
> contato:  (11) 94292-6110
> whatsapp +5511942926110

Reply via email to