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