develooper Front page | perl.perl5.porters | Postings from June 2012

[perl #113554] my() with empty list causes weird error

Thread Previous | Thread Next
From:
Father Chrysostomos via RT
Date:
June 25, 2012 13:51
Subject:
[perl #113554] my() with empty list causes weird error
Message ID:
rt-3.6.HEAD-5009-1340657470-17.113554-15-0@perl.org
On Mon Jun 25 13:38:28 2012, rurban wrote:
> On Mon, Jun 25, 2012 at 10:33 AM, Father Chrysostomos via RT
> <perlbug-followup@perl.org> wrote:
> > On Mon Jun 25 07:29:17 2012, rurban wrote:
> >> On Sun Jun 24 22:44:27 2012, doy wrote:
> >> > Fixed in 8b8c1fb. It looks like this was a bug that was fixed during
> >> the
> >> > course of MAD development, but was added back into the core with
> >> #ifdef
> >> > PERL_MAD just because it was different from the existing core code.
> >> >
> >> > (Also, for future reference: 'stub' is the name of the internal perl
> >> > opcode which generates the '()' construct. See �perl -MO=Concise -
> >> E'my
> >> > @x = ()'� for instance.)
> >>
> >> I disagree.
> >>
> >> The error message is not weird, it is consistent with all perls,
> >
> > Not mad builds.
> 
> Then make MAD consistent with the default non-mad.

That could break code for anyone who is using mad.

> 
> >> and it should be an error.
> >
> > Why?  If my can take a list, why not an empty one?
> 
> my is perl's declaration syntax. It expects one or many lexical
> variable names, not zero.
> lexicals are our default, non lexicals are warned.
> Empty declarations are syntax errors, if "my ();" or "my ;"

I’m afraid your answer is tautological.  Why *shouldn’t* it be allowed
to take an empty list?

Allowing an empty list provides a clear benefit and makes things more
consistent.  What problems could it cause?

> 
> >> If the compiler detects an invalid declaration it
> >> should help the author and not silently allow to do nothing.
> >
> > What is invalid about an empty list?
> 
> It is an empty declaration, which is an syntax error.
> empty lists rhs are perfectly valid, even in declarations
> such as:
>   my ($a,$b) = ();
> but not in a lhs declaration.

But ()=() is allowed.

> 
> >> Re the consistency argument: Why allow now empty declarations? This
> >> makes it inconsistent.
> >>
> >> Why should "my ();" parse correctly?
> >> Why should "my;" parse correctly? Both are clearly syntax errors.
> >> $ perl -e"my;"
> >> syntax error at -e line 1, near "my;"
> >
> > That is consistent with this:
> >
> > $ perl -le 'sort {$a<=>$b} ()'
> > $ perl -le 'sort {$a<=>$b}'
> > syntax error at -e line 1, at EOF
> > Execution of -e aborted due to compilation errors.
> 
> That's not an variable declaration, that's the rhs (right hand side)
> of an op. An empty list.
> 
> I'm open to change the syntax error message.
> See e.g. the attached patch which changes "STUB" to "()"
> 
> $ ./miniperl -e'our ()'
> Can't declare () in "our" at -e line 1, at EOF
> Execution of -e aborted due to compilation errors.
> 
> 
> The real problem is op.c:2476
> #ifdef PERL_MAD
> 	       || type == OP_STUB
> #endif
> to silence the error message with MAD and the underlying cause within MAD.
> 
> BTW: The comment with MJD 20011224 at op.c:2484 is to allow a glob rhs;
>   our $a =*g;

No, I think it is to allow our($s), but not our(${"s"}).

-- 

Father Chrysostomos


---
via perlbug:  queue: perl5 status: resolved
https://rt.perl.org:443/rt3/Ticket/Display.html?id=113554

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About