> 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.

Yeah, I think so.  It might be that the first C<@array[0] =
"something">  is actually valid, and the only things that would be
invalid would be calling mutating methods on the array itself (like
C<pop>).  These are details that will probably be worked out in the
next Apocalypse, "references".

And as far as compile time stuff, this would (unfortunately) be legal
(but croak at runtime):

    sub foo (@array) {
        my @myarr := @array;
        pop @myarr;
    }

Getting that to complain at compile time is equivalent to the halting
problem.

> 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
>     }

Hmm, I can think of a very C++-esque oververbose declaration:

    sub baz (@array_2d of (Array is constant)) { ... }

That seems okay, but it gets ugly really really fast.

    sub baz (@array_3d of (Array of (Array is constant) is constant))
    { ... }

It's especially worrysome because the word C<constant> is so far away
from what it saying is constant.  It might be that you can say:

    sub baz (@array_2d of (Array is constant of (Array is constant)))
    { ... }

But I wonder whether that second C<of> is actually going with
C<constant>.  It'd be nice to see the grammar for these sorts of
things.


> 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; 

Yeah, nobody's quite sure how to implement traits yet ;-)

> 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;
>     }

It might need to be a bit more declarative to get things to work at
compile time.

Luke

> 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