From: Larry Wall [EMAIL PROTECTED]
> Perhaps there should be a way
> to declare a parameter to be pass-by-value, producing a
> modifiable variable that does not affect the caller's value.
> But I'm not sure saving one assignment in the body is worth
> the extra mental baggage.
.... and later he said ...
> The default is pass-by-reference, but non-modifiable. If
> there's a pass-by-value, it'll have to be specially requested
> somehow.
>
> This is a minimal difference from Perl 5, in which everything
> was pass-by-reference, but modifiable. To get pass-by-value,
> you just do an assignment. :-)
Thesis: there should be an option for pass-by-value-modifiable without
requiring a new assignment or new variable.
Reason 1: Pass-by-value-non-modifiable *is* a significant change from
Perl5. I know this doesn't quite mesh with the technical facts, but from
the how-people-actually-use-it perspective, there's a big change. Yes,
Perl5 is pass-by-reference-modifiable, but in practice most people don't
use it that way. Except for short 1-3 line functions, most subs start by
creating named variables and copying them from @_, like one of these lines:
my $self = shift;
my ($tag) = @_;
That is, they actually use it like pass-by-value-modifiable. Now, Perl6
will give us a slicker way to get well-named variables as subroutine
arguments:
sub mysub ($name, $email) { ... }
Ah, but that's where a bait-and-switch problem comes in. It feels like the
param list is taking the place of "my ($tag) = @_;", but the new-improved
named arguments don't act the same way. Suddenly they're not modifiable.
That's different.
Reason 2: Enforced non-modifiable arguments are a pain. PL/SQL does not
allow you to modify pass-by-value arguments to functions, and most PLSQL
programmers I've talked to hate that. It requires you to create a named
argument, then another variable with an almost-same-name that can be
modified. My PLSQL is cluttered with variables named v_email and p_email,
instead of just email. I would hate to see Perl go down that road.
Resolution: Use whatever default seems good, but provide the freedom to get
pass-by-value-modifiable, perhaps something like this:
sub mysub ($name is m, $email is m) { ... }
-Miko
--------------------------------------------------------------------
mail2web - Check your email from the web at
http://mail2web.com/ .