On Sun, Sep 14, 2008 at 09:13:33PM +1000, Vasily Chekalkin wrote: > Ilya Belikin wrote: >> >> Hi, >> look like bug (in r31017): >> >> my $k = 'bar'; >> my %s; >> say defined $k; # 1 >> say defined %s{$k}; # 0 >> say defined $k and defined %s{$k}; # 1 (!) must be 0 >> say 1 && 0; # 0 > > I replyed in ticket, but it doesn't hit mailinglist. This is bug in > parsing. "say defined $k and defined %s{$k};" parsed as "(say defined > $k) and defined %s{$k};"
As Carl correctly noted, Rakudo has the parsing for infix:<and> correct -- infix:<and> has looser precedence than listops (including 'say'), so Rakudo is doing the right thing here. The intended version is likely: say defined $k && defined %s{$k}; However, as of r31017 Rakudo did not have 'defined' as a named unary, so parsed this version as say( defined( $k && defined( %s{$k} ) ) ); which is also not what is wanted. In r31116 I've changed 'defined' to be a named unary, and we now get the desired output: $ cat x my $k = 'bar'; my %s; say defined $k; # 1 say defined %s{$k}; # 0 say defined $k and defined %s{$k}; # 1 say defined $k && defined %s{$k}; # 0 $ ./parrot perl6.pbc x 1 0 1 0 We probably need to test that 'defined' is a named unary in t/spec. Closing ticket, thanks. Pm