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

Reply via email to