On Tue, 21 Feb 2017 05:15:56 -0800, jar...@bansu.fi wrote:
> EXAMPLE:
> my %hash = foo => 1;
> if %hash<a>:exists {
> say "not gonna print this";
> }
> my $key = 'b';
> if %hash«$key»:exists {
> say "why i'm here";
> }
> 
> OUTPUT:
> why i'm here
> 
> EXPECTED RESULT:
> (Should not print anything)
> 
> FROM #perl6 CHANNEL:
> 14:09 < masak> m: my %hash = foo => 1; my $key = 'b'; if
> %hash«$key»:exists { say "why i'm here" }; say "alive"
> 14:09 <+camelia> rakudo-moar 80e0bc: OUTPUT: «why i'm here␤alive␤»
> 14:09 < masak> huh.
> 14:10 < masak> I... I call bug.
> 14:10 < masak> m: my %hash = foo => 1; my $key = 'b'; if
> %hash«$key»:exists { say "why i'm here" }; say %hash.perl
> 14:10 <+camelia> rakudo-moar 80e0bc: OUTPUT: «why i'm here␤{:foo(1)}␤»
> 
> VERSION INFORMATION
> $ perl6 -v
> This is Rakudo version 2017.01 built on MoarVM version 2017.01
> implementing Perl 6.c.
> 
> $ uname -a
> Linux xprs 4.9.9-1-macbook #1 SMP PREEMPT Mon Feb 13 17:07:28 EET 2017
> x86_64 GNU/Linux
> 
> Best regards,
> 
> 
> --
> Jarkko

Thank you for the report. There was a discussion[^1] on the topic later on that 
clarified what
is happening in this particular case, and the behaviour is not a bug.

The interpolation syntax you're using doesn't just interpolate the variable's
contents, but also splits them up on whitespace (makes sense; it's as if the 
variable's content was
written in «...» directly):

  <Zoffix> m: my $x = 'a b'; dd «$x»
  <camelia> rakudo-moar 80e0bc: OUTPUT: «slip("a", "b")␤»

The result is a slip, so that at the end you end up with a nice flat list:

  <Zoffix> m: my $x = 'a b'; dd «$x $x»
  <camelia> rakudo-moar 80e0bc: OUTPUT: «("a", "b", "a", "b")␤»

You always get a slip from just «$x», regardless of whether it ends up
as just one or multiple elements:

    <Zoffix> m: my $x = 'a'; dd «$x»
    <camelia> rakudo-moar 80e0bc: OUTPUT: «slip("a",)␤»
    <Zoffix> m: my $x = 'a b'; dd «$x»
    <camelia> rakudo-moar 80e0bc: OUTPUT: «slip("a", "b")␤»

And if you do meant for the variable to be interpolated as just
one item, then use quotation marks; and in that case it does end up as on Str:

    <Zoffix> m: my $x = 'a b'; dd «"$x"»
    <camelia> rakudo-moar 80e0bc: OUTPUT: «"a b"␤»

So now, if we circle back to the original code:

    %hash«$key»:exists { say "why i'm here" };

It will always succeed, as long as $key is not an empty string, because you're 
always
giving a slice to lookup and getting a list back. And were different semantics 
used, you'd
end up with a case where %hash«$key»:exists would tell you whether or not a key 
existed,
**but only if that key did not have any whitespace in it**; if it does, then 
the answer would
be always true.

The correct syntax you're looking for is:

    %hash{$key}:exists { say "why i'm here" };

That way you're passing whatever is in $key literally; so this is the way to 
refer to object
hashes as well:

    <Zoffix> m: my %h := :{ 42 => 'foo' }; say %h{42} # make a Hash with Int 
keys, give Int when looking up key
    <camelia> rakudo-moar 80e0bc: OUTPUT: «foo␤» 
    <Zoffix> m: my %h := :{ 42 => 'foo' }; say %h<42> # lookup fails, because 
we're giving a Str, not Int, key
    <camelia> rakudo-moar 80e0bc: OUTPUT: «(Any)␤»
    <Zoffix> m: my %h := :{ 42 => 'foo' }; say %h«42» # same difference
    <camelia> rakudo-moar 80e0bc: OUTPUT: «(Any)␤»

Cheers,
ZZ

[1] https://irclog.perlgeek.de/perl6/2017-02-21#i_14137505

Reply via email to