Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Remember: Outlaw to declare a lexical twice in the same scope

11 views
Skip to first unread message

Steve Lukas

unread,
Jan 19, 2007, 12:50:43 PM1/19/07
to perl6-l...@perl.org
Hi @larry,
I want to remember to my proposal from september 2006.
It targets on changing S04. The discussion is summarized on:
http://www.oreillynet.com/onlamp/blog/2006/09/weekly_perl_6_mailing_list_sum_3.html

So, please change S04 as discussed.
Thanks
Stefan



---------------------------------
Expecting? Get great news right away with email Auto-Check.
Try the Yahoo! Mail Beta.

cma...@gmail.com

unread,
Jan 27, 2007, 4:23:03 AM1/27/07
to perl6-l...@perl.org
Steve Lukas (>):

> Hi @larry,
> I want to remember to my proposal from september 2006.
> It targets on changing S04. The discussion is summarized on:
> http://www.oreillynet.com/onlamp/blog/2006/09/weekly_perl_6_mailing_list_sum_3.html
>
> So, please change S04 as discussed.

I, too, would like to point to this as an important issue. It would be
nice if someone could point to a good reason to change this behavior
from the one in Perl 5. I might be all wrong in my reasons to be
horrified at the following:

my $foo;
# ...later in the same scope...
my $foo; # illegal Perl5, legal Perl6

But if I am, I would like to know why. Perl6 is strict in not letting
the programmer declare a variable less then once, why shouldn't it be
strict in not letting them declare it more than once?

--
masak

Dave Mitchell

unread,
Jan 27, 2007, 8:41:32 AM1/27/07
to Carl Mäsak, perl6-l...@perl.org
On Sat, Jan 27, 2007 at 10:23:03AM +0100, Carl Mäsak wrote:
> my $foo;
> # ...later in the same scope...
> my $foo; # illegal Perl5, legal Perl6

No, that's perfectly legal in perl5; it just generates a warning:

use warnings;
my $x = 1;
my $f1 = sub { $x };
my $x = 2;
my $f2 = sub { $x };
printf "f1=%d f2=%d x=%d\n", $f1->(), $f2->(), $x;

which gives

$ perl588 /tmp/p
"my" variable $x masks earlier declaration in same scope at /tmp/p line 6.
f1=1 f2=2 x=2

--
But Pity stayed his hand. "It's a pity I've run out of bullets",
he thought. -- "Bored of the Rings"

cma...@gmail.com

unread,
Jan 27, 2007, 9:43:10 AM1/27/07
to perl6-l...@perl.org
Dave (>), Carl (>>):

> > my $foo;
> > # ...later in the same scope...
> > my $foo; # illegal Perl5, legal Perl6
>
> No, that's perfectly legal in perl5; it just generates a warning:
>
> use warnings;
> my $x = 1;
> my $f1 = sub { $x };
> my $x = 2;
> my $f2 = sub { $x };
> printf "f1=%d f2=%d x=%d\n", $f1->(), $f2->(), $x;
>
> which gives
>
> $ perl588 /tmp/p
> "my" variable $x masks earlier declaration in same scope at /tmp/p line 6.
> f1=1 f2=2 x=2

Ah, your quite right. Going back, I see that this was indeed pointed
out in the original thread as well; I just didn't catch it then.

http://groups.google.com/group/perl.perl6.language/browse_frm/thread/05c902b290fb7a5a/f9506f5acde3ceb4?#f9506f5acde3ceb4

FWIW, I think a warning is fine. (Because in my world a warning means
that something isn't "perfectly legal".) Maybe it's in line with
Perl's policy of being forgiving when possible to give a warning
instead of a compile-time error. That's fine.

What bothers me is that one might not even get a warning in Perl 6.
Since a duplicated variable declaration is often due to programmer
confusion, it seems like we're passing up such a fine opportunity for
telling them about it. What underlying design decision is it that
prevents us from giving a warning here, as in Perl 5?

Pugs currently executes the above code and gives the same output, but
no warning:

$ pugs test.pl
f1=2 f2=2 x=2

// Carl

Smylers

unread,
Jan 27, 2007, 6:23:50 AM1/27/07
to perl6-l...@perl.org
Carl Mäsak writes:

> my $foo;
> # ...later in the same scope...
> my $foo; # illegal Perl5, legal Perl6

That isn't illegal in Perl 5. It yields the warning:

"my" variable $foo masks earlier declaration in same scope

but it does work.

Smylers

0 new messages