On Wed, 14 Aug 2002, Luke Palmer wrote:

> Why?  We could make arglists exactly equivilent to the way they're done in 
> Perl 5, which is a good way.
> 
>       sub foo($a, $b, *@c) {...}
> 
> Would be exactly equivilent to Perl 5's
> 
>       sub foo { my ($a, $b, @c) = @_; ... }

I've got another idea.  How about using a copy-restore technique?

First, assume all arguments are pass-by-reference, whether constant or not.

Second, allow "is ro" as a modifier to force constant semantics -- in this 
case, don't make a copy, just use the reference and refuse to modify it.

Third, allow "is rw" as a modifier to enable copy-restore, and to make the 
reference modifiable.

Fourth, copy all named parameters into local variables from the passed 
reference (except for "is ro" parameters, which should be aliased) -- and 
then keep @_ with the actual references, as in Perl 5.  (Unlike Perl 5, the 
"is ro" parameters would not be modifiable even via @_.)

Finally, for "is rw" parameters, copy the modified local variable back to 
the referenced parameter (the original one, even if @_ was shifted!), but 
ONLY for a normal subroutine exit.

This would allow pass-by-value semantics by default for convenience, easily 
forced read-only parameters, pass-by-reference semantics when desired, but 
with a twist -- if the function aborts (throws an exception), no parameters 
have been changed, which offers hassle-free transaction-like atomicity.

If a function really wants to modify its parameter, despite throwing an 
exception, it could do so via @_ directly.  Or, we could also allow another 
modifier "is ref" to use simple (modifiable) pass-by-reference semantics, 
but default to copy-restore for "is rw"...

This seems like it could be the best of all worlds -- what do people think?

Deven

Reply via email to