Identifier resolution, the great implementation defined mess.

Walter Bright via Digitalmars-d digitalmars-d at puremagic.com
Sun Sep 21 13:04:49 PDT 2014


On 9/20/2014 10:29 PM, deadalnix wrote:
> DMD does very bizarre things. I think I should write a DIP, but time is always
> running low...
>
> Free goodie: when you import, all symbol are resolved via the expected import
> resolution mechanism. All ? No, the root package is imported in the local scope.
>
> foo(int a) {
>    import a.b.c;
>    // a is now a package and not the parameter a anymore.
> }

What's bizarre about it? You declared a package symbol 'a' in the local scope 
with the import declaration.

The way imports (and mixin templates) work for symbol lookup is completely 
consistent.

You could reasonably argue that since package 'a' shadows parameter 'a' in the 
same way that this issues an error:

   foo(int a) {
     double a;
   }

but, again, there is nothing bizarre about the import name lookup.


Lookup rules are straightforward:

   scope is current scope
   do {
       look up name in scope
       if name is found, done!
       look up name in imports imported into scope
       if name is found, done!
       set scope to enclosing scope
    } while scope exists

I don't know what mental model people have for how lookups work, but the above 
algorithm is how it actually works.


More information about the Digitalmars-d mailing list