On Wednesday 03 July 2002 12:54 pm, Thom Boyer wrote:
> To get a better feel for the weirdness that happens with pass-by-name,
> consider this example:
> sub check_it_out {
> $_[0] = 0; #step 1
> $_[1] = 7; #step 2
> }
>
> my @a = (0,1,2,3,4);
> my $i = 2;
> check_it_out($i, $a[$i]);
> print join '', @a;
>
> This prints '01734' under Perl 5, because the arguments ($i and $a[2]) are
> passed by reference.
>
> If the arguments to check_it_out() were passed by name instead, the result
> would be '71234',
> because step 1 would change $i to have the value 0, and *then* $a[$i] would
> be evaluated in
> step 2 (using $i's new value), causing the 7 to be assigned to $a[0] (not
> $a[2]).
Creepy. Here's my creepy thought for the day: is there a possibility for a
prototype which would implicitly wrap a sub{} around a passed-in argument?
i.e. lazy evaluation via sub prototype?
sub check_it_out (&$idx is rw, &$val is rw) {
$idx = 0;
$val = 7;
}
check_it_out($i, $a[$i]);
# really means:
check_it_out(sub is rw { $i }, sub is rw { $a[$i] });
I would guess parser tricks and tied scalars would allow it somehow, if not
out of the box.
Still creepy.
Ashley Winters