On Sun, 15 Oct 2017 00:12:18 -0700, c...@zoffix.com wrote:
> On Mon, 19 Dec 2016 11:39:54 -0800, elizabeth wrote:
> > Fixed with 3fe5893 , tests needed.
> >
> > > On 16 Dec 2016, at 22:14, Elizabeth Mattijsen (via RT) <perl6-bugs-
> > > follo...@perl.org> wrote:
> > >
> > > # New Ticket Created by  Elizabeth Mattijsen
> > > # Please include the string:  [perl #130363]
> > > # in the subject line of all future correspondence about this
> > > issue.
> > > # <URL: https://rt.perl.org/Ticket/Display.html?id=130363 >
> > >
> > >
> > > $ 6 'm/./; dd $/'
> > > No such method 'match' for invocant of type ‘Any'
> > >
> > > $ 6 '/./; dd $/'
> > > Nil $/ = Nil
> > >
> > >
> > > Apparently the codegen of m/./ introduces a call to .match, whereas
> > > /./ codegens to something that does *not* call .match.  I can only
> > > assume that’ because it assumes there can be named parameters (even
> > > though we could see that that is not the case).
> > >
> > > So fixing the codegen in this case would not solve this problem:
> > >
> > > $ 6 'm:2nd/./; dd $/'
> > > No such method 'match' for invocant of type ‘Any'
> > >
> > >
> > > The only way I see we could fix this, is by adding an Any.match or
> > > a
> > > Mu.match, that would just set $/ to Nil.
> 
> I'm 10 months late to the party, but this looks off to me.
> 
> The commit adds a `.match` method that does nothing to virtually every
> object.
> The listed reasoning is that `m/./` codegens differently than `/./`
> but
> that's still the case: `/./` constructs a Regex object (and in non-
> Bool context
> no match against $_ is done), while `m/./` performs a match with $_,
> so it
> wasn't surprising that `m/./` would complain about "no .match on Any",
> while `/./` didn't.
> 
> Seems the new behaviour simply hides a bug in user's code, so I'm
> hesitant
> to add it as a requirement to the language spec.


In addition, I see this difference in the actual "match against $_" thing:

    <Zoffix__> m: $_ = 'not right';  sub { $_ = Str; say so /./ }()
    <camelia> rakudo-moar ebb0521bd: OUTPUT: «True␤»
    <Zoffix__> m: $_ = 'not right';  sub { $_ = Str; say so m/./ }()
    <camelia> rakudo-moar ebb0521bd: OUTPUT: «Use of uninitialized value of 
type Str in string context.␤Methods .^name, .perl, .gist, or .say can be used 
to stringify it to something meaningful.␤False␤  in sub  at <tmp> line 1␤»

Regex.Bool looks[^1] up the callstack for the first .DEFINITE `$_`, whereas, 
the `m/./` form just uses whatever lexical $_ is available.
Were both behaving the same, the OP's code would produce the same behaviour. 
IMO what `m/./` does is more correct, as a buggy
piece of code that sets $_ to a typeobject all of a sudden makes `/./` match 
some data the user likely never meant to match against.

[1] https://github.com/rakudo/rakudo/blob/ebb0521bd/src/core/Regex.pm#L83
[2] 
https://github.com/rakudo/rakudo/blob/ebb0521bd/src/Perl6/Actions.nqp#L7962-L7967

Reply via email to