A Hash either takes some number of pairs
my %h = a => 1, b => 2;
or an even number of elements, which become key value pairs
my %h = 'a', 1, 'b', 2;
`eager` returns an eager Sequence/List etc
(eager a => 1).raku # (:a(1),)
A Sequence/List is itself a thing. Which means that it can be a key.
So when you pass that to a Hash constructor, it accepts that as the key,
but it still needs the value to go with it.
my %h{Any} = (eager a => 1), 2;
# {(a => 1) => 2}
That is the only key in that Hash is itself a Pair object.
my $key = a => 1;
my %h = ($key,), 2;
say %h{$key}; # 2
`eager` only really makes sense on something that is already an Iterable.
my %h = eager gather { take 'a'; take 1 }
So since `eager` is defined as a Sequence/List operation, it turns its
arguments into that if they aren't already.
my \value = eager "foo";
say value.raku; # ("foo",)
What you didn't notice is that your third example also went wrong. It has a
key which is a Pair, and a value which is also a Pair.
my %h;
%h{ foo => 1 } = (bar => 2);
# {foo 1 => bar => 2}
my %h = ( foo => 1, ), bar => 2;
# {foo 1 => bar => 2}
Note that since Hashes have Str keys by default, that the key actually gets
stringified instead of staying a Pair object.
%h{ "foo\t1" } = bar => 2;
say ( foo => 1 ).Str.raku; # "foo\t1"
If we use an object key, it doesn't get stringified. Which better shows
what happened.
my %h{Any} = ( foo => 1, ), bar => 2;
# :{(foo => 1,) => bar => 2}
I honestly don't understand why you would `eager` the argument of a `take`.
It's too late to mark the `gather` as eager.
On Tue, Apr 20, 2021 at 12:39 AM Norman Gaywood <[email protected]> wrote:
> Hi, I can't figure out why the last line here is failing.
> Version 2020.07
>
> $ raku
> To exit type 'exit' or '^D'
> > my %h = gather { take "foo"=>1; take "bar"=>2;}
> {bar => 2, foo => 1}
> > my %h = gather { take "foo"=>1}
> {foo => 1}
> > my %h = gather { take eager "foo"=>1; take "bar"=>2;}
> {foo 1 => bar => 2}
> > my %h = gather { take eager "foo"=>1}
> Odd number of elements found where hash initializer expected:
> Only saw: $(:foo(1),)
> in block <unit> at <unknown file> line 1
>
> --
> Norman Gaywood, Computer Systems Officer
> School of Science and Technology
> University of New England
> Armidale NSW 2351, Australia
>
> [email protected] http://turing.une.edu.au/~ngaywood
> Phone: +61 (0)2 6773 2412 Mobile: +61 (0)4 7862 0062
>
> Please avoid sending me Word or Power Point attachments.
> See http://www.gnu.org/philosophy/no-word-attachments.html
>