Variable no-shadowing problems
Gregor Richards
Richards at codu.org
Fri Dec 22 16:29:25 PST 2006
Chris Miller wrote:
> To those not sure what shadowing means, here is an example of variable
> shadowing:
> int i;
> {
> int i;
> }
> The inner `i` variable shadows the outer one.
>
>
> D has made such shadowing illegal and flags it as an error. I'm against
> this restriction, but I have a compromise.
>
> I am proposing a `shadow` keyword be added to D. Actually, the general
> idea is from someone else from #D IRC chat, but I have several reasons
> why explained below.
>
> 1) Accidentally shadowing a variable. If this happens you will have to
> go back and manually fix up all uses of the shadowed name, which has a
> very high chance of error. Forget to fix one and it goes by silently;
> bug. Or, simply add `shadow` to its declaration, avoiding tedious,
> error-prone fixing, and make people aware of what's going on.
I was going to respond to this somehow, but I don't think I really have
a response ... IMHO this doesn't actually cut down the debugging time at
all, since in all likelihood coder-X will have inadvertantly
mixed-and-matched in the inner scope. Maybe that's not true, I don't know :)
>
> 2) Adding code. You can simply add a { } block and declare at will.
> With no shadowing, I am tempted to append random numbers to my variable
> names so I don't run into this, or moreso tempted to reuse variable
> names like is popular from C, as in declare once at the top of the
> function and reuse the variable for different things.
I think this scenario could be more cleanly filed under "code reuse." If
you copy/paste code from one project to another, with shadowing you
don't have to worry (too much) about variable collision.
>
> 3) Code generators emitting D source code. They may not wish to keep
> track of such shadowing and could simply mark all declarations as
> `shadow`.
This I agree with entirely.
>
>
> Notes:
>
> `shadow` does not allow redeclarations in the exact same scope
> (although perhaps it could).
Redeclaration in the same scope ... hmmmmmm ... makes me gag a bit.
>
> As for reason (1), if you are personally against shadowing, you are not
> forced to use the keyword and can continue treating it how it is done now.
Yeah, if you never plan on reading anybody else's code ;)
>
> - Chris
My opinion in short: I don't agree with 1, I somewhat agree with 2, I
agree entirely with 3. You've covered the full gambit, bravo ;)
- Gregor Richards
More information about the Digitalmars-d
mailing list