James Mastros wrote:
Juerd wrote:
Just typing "my " before the first use of a variable isn't hard, and it
makes things much clearer for both the programmer and the machine.
Does this imply that it's now possible to type C<my @foo[23] = 42;>, and declare @foo? In the current perl, this doesn't work -- it's a syntax error. It'd certainly make many constructs easier.
I see why that's an error. It can be very confusing.... In literal fashion you are attempting to make the 24th element of @foo lexical, and having some elements of @foo have different scope from the rest is a bad idea.
However, I have also been bitten by that rather frequently, though with a different construct. Typically it's with hash slices:
my @[EMAIL PROTECTED] = @[EMAIL PROTECTED]; # ERROR!
my %newhash; @[EMAIL PROTECTED] = @[EMAIL PROTECTED]; # Okay, but not as convienent.
This was part of the reason I spawned this thread. But it was also due to being in the middle of trying to write some decent quality code under a heavy time pressure, and noticed that >50% of my lines had a 'my' on them. It's typically not that high of a percentage, but when you are creating lots of small utility routines, declaring all your lexicals can be a significant part of the task. I added to this the observation that lexical variables are significantly more common than non-lexicals, and thought out loud as to why I was doing more work for the common case than the uncommon case, in a language that generally doesn't have that problem.
One of the other reasons in favor of the idea was aesthetic.
# stuff which declares $x, $z, and $q
$x = 4; my $y = 7; $z = 12; my $r = 4543; $q = 121;
compared to:
# stuff which declares $x, $z, and $q
$x = 4; $y = 7; $z = 12; $r = 4543; $q = 121;
With a fixed width font, like all code editors use, all the =' like up, and I can quickly scan the var names to get to the one I want to change at that moment. Yes, I could have added a 'my ($y, $r);' to the front of the list, but that's adding another statement to the mix, same as the hash slice above, adding considerably more weight to 'my' than just three keystrokes (m - y - space).
However, given the strong opposition (with merits) to this in other responses, I am willing to live with it the P5 way. Just seemed like autolexicals was rather DWIMish.
Another facet of this discussion comes into account when also specifying type.
from S9: my bit @bits; my int @ints; my num @nums; my int4 @nybbles; my str @buffers; my ref[Array] @ragged2d; my complex128 @longdoublecomplex;
Wouldn't this be much better as: bit @bits; int @ints; num @nums; int4 @nybbles; str @buffers; ref[Array] @ragged2d; complex128 @longdoublecomplex;
Given that most of the stated reservations had to deal with explicit declaration better defining scope, what is wrong with drooping the my in this case?
-- Rod Adams