On Fri, 29 Sep 2017 22:43:56 -0700, b...@abrij.org wrote:
> On Sun, 28 May 2017 02:31:34 -0700, sml...@gmail.com wrote:
> > This bug is still present in
> >
> > This is Rakudo version 2017.05-272-gfa7aa1c36 built on MoarVM version
> > 2017.05-25-g62bc54e9
> > implementing Perl 6.c.
> 
> 
> Not an optimizer problem, still happens with --optimize=0
> 
> Here's a history of the rule term:sym<identifier>, which apparently
> only handles the case of subroutine calls of the form "thing()".
> 
> We start here many years ago:
> <identifier> <?[(]> <args>
> 
> Then we decide we do not want typecasts to fall into this rule:
> <identifier> <!{ $*W.is_type([~$<identifier>]) }> <?[(]> <args>
> 
> Then we implement unspace between the name and the parenthesis.
> <identifier> <!{ $*W.is_type([~$<identifier>]) }> <?before
> <.unsp>|'('> <args>
> 
> ...that is a bit tricky... was it intentionally not "<.unsp>? '('"?
> We'll get into that in a bit.
> 
> Next we get a commit that does some better error reporting (there's
> more
> before and after the part we are watching)
> 
> <identifier> <!{ $*W.is_type([~$<identifier>]) }> <?before
> <.unsp>|'('> <![:]> { $pos := $/.pos } <args(1)>
> 
> ...so, what's that new "<![:]>" for?  A ':' cannot happen here
> due to the "before"...
> 
> So, let's look at <args>, keeping in mind that it can
> only happen after "foo\ " or "foo ("... but the unspace
> or paren in those two forms is part of the string <args>
> is matching.
> 
> There's other stuff in it but this is the meat:
> 
> [
> | '(' ~ ')' <semiarglist>
> | <.unsp> '(' ~ ')' <semiarglist>
> | [ \s <arglist> ]
> | <?>
> ]
> 
> ...all four cases can hit.  Only the first two were hittable
> before the unspace change... well maybe a malformed semiarglist
> could get into the fourth one somehow.
> 
> The unspace change would prevent the third one from being hit...
> unless there were a way to follow an unspace by a space... but it
> would
> be silly to only then accept a single space character there.
> One wonders what nefarious corner case that covers.
> 
> The real problem comes with that fourth alternative.  We of
> course need to support calling with no parens for argumentless
> forms.  But that case can fall through to either of term:sym<name>
> or term:sym<identfier>.  Both actions methods seem to be able to
> handle setting up barename calls.
> 
> But you can fall through this case to term::sym<identifier> even
> when there is something else after the unspace which does not
> resemble an argument list at all.  Only term:sym<name> has the
> ability to handle that.  Like, in this ticket, the rest
> of a postfix method call.  That means this:
> 
> a\ .Str
> 
> ...is being processed as:
> 
> (&a()) $_.Str
> 
> Now, maybe LTM was being leaned on to force that case through
> term:sym<name>, but perhaps some of the error reporting stuff
> made some confusing sequenceish points that ruined that.  At
> any rate this weekend I'll submit a patch changing it to:
> 
> <identifier> <!{ $*W.is_type([~$<identifier>]) }> [ <?before <.unsp>?
> '('> <?> | \\ <?before '('> ]
> 
> ...which passes spectest and handles these cases:
> 
> $ perl6 -e 'my constant \a = 42; say a\ .Str;'
> 42
> $ perl6 -e 'say\(42)'
> 42
> $ perl6 -e 'my constant \a = [1,2]; say a\ [1];'
> 2
> $ perl6 -e 'my constant \a = {:a,:b}; say a\ {"b"};'
> True
> $ perl6 -e 'my constant \a = {:a,:b}; say a\ <b>;'
> True
> 
> ...and I'll see if I can find out what else to tweak to make
> this work:
> 
> $ perl6 -e 'class A { our sub foo ($a) { "OHAI $a".say } };
> A::foo\(42)'
> Too few positionals passed; expected 1 argument but got 0
>   in sub foo at -e line 1
>   in block <unit> at -e line 1
> 
> ...it looks like this patch breaks the following, but I'm not sure
> that it should work:
> 
> $ perl6 -e 'say\ 42'
> ===SORRY!===
> Argument to "say" seems to be malformed
> 
> ...and these all already worked, but I'll make sure they are tested
> when I write the tests:
> 
> $ perl6 -e 'say\ (42)'
> 42
> $ perl6 -e 'my constant \a = [1,2]; say a\[1];'
> 2
> $ perl6 -e 'my constant \a = {:a,:b}; say a\{"b"};'
> True
> $ perl6 -e 'my constant \a = {:a,:b}; say a\<b>;'
> True
> $ perl6 -e 'class A { our sub foo ($a) { "OHAI $a".say } }; A::foo\
> (42)'
> OHAI 42
> $ perl6 -e 'say IO::Path\ .^name;'
> IO::Path
> $ perl6 -e 'IO::Path\.^name.say'
> IO::Path
> $ perl6 -e 'class A { our @a = 1,2; }; say @A::a\ [1]'
> 2
> $ perl6 -e 'class A { our @a = 1,2; }; say @A::a\[1]'
> 2
> $ perl6 -e 'class A { our %a = :a,:b; }; say %A::a\{"b"}'
> True
> $ perl6 -e 'class A { our %a = :a,:b; }; say %A::a\ {"b"}'
> True
> $ perl6 -e 'class A { our %a = :a,:b; }; say %A::a\ <b>'
> True
> $ perl6 -e 'class A { our %a = :a,:b; }; say %A::a\<b>'
> True

Fix added in rakudo commit f427575432 and additional tests in roast c22107d53.  
Resolving this ticket.

Reply via email to