On 2/16/2011 11:08 PM, Clark J. Wang wrote:
On Thu, Feb 17, 2011 at 11:13 AM, Chet Ramey<chet.ra...@case.edu>  wrote:
If I declare a variable at the top scope using -r, it will prevent me
from declaring a local copy in a subroutine. This problem happens in
this version of bash as well as in bash4 under Fedora 14.
This is intentional.  A variable is declared readonly for a reason, and
readonly variables may not be assigned to.  I don't believe that you
should be able to use a function to circumvent this.

That makes little sense to me. I don't see any disadvantages if a local var
is allowed to use the same name as a global readonly var. And with current
bash behavior we may see var name collisions even with the local keyword.

Chet
I'd like to agree with Clark. I agree that a variable is declared readonly for 
a purpose, but the act of declaring any variable in a subroutine must 
explicitly mean that it is a different instance than any other instance.
If I declare an outer scope variable as an array or an integer, why should 
that be treated any differently than if it's declared as readonly? (I do 
understand that a type like int or container declaration like array is 
different from a readonly attribute, but either way, it's just a part of the 
implementation of a scoped symbol table.) Internally, we either have scoped 
symbol tables or we don't. Worst case scenario, it would be easy (whatever 
that means) to write a bash lint function that would warn about a global 
readonly variable that is shadowed by a variable of the same name in a function.
Just for context, I'm at a place that has maybe 100K lines of hack'n'wack bash 
code that was written by the usual crowd of people who only mostly knew 
minimal Bourne shell where everything is a self contained monolithic 
structure. I'm trying to refactor this nightmare so that we can create common 
libraries of subroutines, common libraries of global variables for project 
specific purposes, an some of those globals need to be readonly. When people 
write subroutines and declare a local variable, they should not need to go 
through a clearing house to see if a name is safe to use locally. If they 
*don't* declare it, then (and only then) they should expect to bump into any 
predefined global variable. The idea is that not declaring a variable in a 
function is the same as creating a global.
Have a swayed your thinking?

And BTW Chet, you're high on my list of people who have made a non-readonly global impact on the world. :-)
--
Time flies like the wind. Fruit flies like a banana. Stranger things have  .0.
happened but none stranger than this. Does your driver's license say Organ ..0
Donor?Black holes are where God divided by zero. Listen to me! We are all- 000
individuals! What if this weren't a hypothetical question?
steveo at syslang.net

Reply via email to