On Thu, Aug 18, 2005 at 12:02:53AM +0800, Autrijus Tang wrote:
: On Wed, Aug 17, 2005 at 08:47:18AM -0700, Larry Wall wrote:
: > : >That could be made to work by defining constant to mean you can assign
: > : >to it if it's undefined.  But then it gets a little harder to reason
: > : >about it if $pi can later become undefined.  I suppose we could
: > : >disallow undefine($pi) though.
: 
: If you can assign it when it contains an undefined value, bad
: things happen:
: 
:     sub f ($x is readonly) { $x = 10 }
:     my $a; f($a);
: 
: Compare this with:
: 
:     my $x is readonly;
:     $x = 10;
: 
: If it is defined as "bound to a immutable value cell", both cases
: above would fail, which is imho the easiest to explain.

Though I think most people have a pretty good understanding of "worm"
these days, what with CD and DVD burners...

"Darn, I turned my third parameter into a coaster.  Now what am I gonna do?"

: > You could still reason about it if you can determine what the initial
: > value is going to be.  But certainly that's not a guarantee, which
: > is one of the reasons we're now calling this write/bind-once behavior
: > "readonly" and moving true constants to a separate declarator:
: > 
: >     my $pi is readonly;
: >     $pi = 3;
: 
: The question remains, whether you can bind the readonliness away:
: 
:     my $pi is readonly; # undef at this point
:     my $e is rw = 2.7;
:     $pi := $e;
:     $pi = 9;
: 
: I can argue both sides -- rebindable is easier to implement, but
: non-rebindable is perhaps more intuitive.

English has a long history of hoisting the adjectives from the object
to its container.  "I'd like a nice cup of tea" and such.  So in general
I think people will expect a readonly variable to contain a readonly
value, and maybe we should do the extra work to enforce that transitively.

That being said, there's also a history of rebinding references, as
in "That woman is a man!"  But we intuitively recognize that there's
something funny going on there linguistically.  We can deal with it
as humans, but maybe we can allow the soulless computer to throw a
exception on such contradiction instead of laughing like we do.

That being said, it's still quite possible that

    my $pi is readonly;

realizes that it's not bound to anything reasonable yet, and set
up a "worm" container of some sort that binds lazily at run time.
As with parameter defaults, it's more about whether the container's
value exists than whether it's defined.

Larry

Reply via email to