As I understand it, the comments in the following two subs are correct.

    sub foo (@array) {
        my $x = @array[0];       # ok, allowed to read
        @array[0] = "something"; # compile fails because '@array is ro'
    }

    sub bar (@array_2d) {
        my $x = @array[0];       # ok, allowed to read
        $x[0] = "something";     # ok, said nothing about contents
    }

That is, you can't STORE into a read-only variable, but if the thing
you FETCH has its own STORE method then that method will work fine.

What I would like is something like the following to prevent corruption
of complex data structures passed to subroutines.

    sub baz (@array_2d is very_read_only) {
        my $x = @array[0];          # ok
        $x[0] = "something";        # would croak at runtime but ...
        @array[0][0] = "something"; # ... this already failed to compile
    }

Are there any plans for such a trait or would it be easy for a user to
implement?  I have no idea how to implement it; presumably the 
variable's FETCH method would return an alias with the same 
very_read_only trait attached.  I'm sure this ain't even close:

    method FETCH ($var, $index) {
        my $val = $var[$index];
        return $val unless $val.can("STORE");
        my $x is very_read_only := $val;
        return $x;
    }

And how the trait connects to the FETCH-replacing I don't even know 
where to begin.

-- 
Rick Delaney
[EMAIL PROTECTED]

Reply via email to