Identifier resolution, the great implementation defined mess.
deadalnix via Digitalmars-d
digitalmars-d at puremagic.com
Sun Sep 21 23:09:14 PDT 2014
On Monday, 22 September 2014 at 06:05:42 UTC, Walter Bright wrote:
> On 9/21/2014 2:17 PM, ketmar via Digitalmars-d wrote:
>> On Sun, 21 Sep 2014 13:04:49 -0700
>> Walter Bright via Digitalmars-d <digitalmars-d at puremagic.com>
>> wrote:
>>
>>> I don't know what mental model people have for how lookups
>>> work, but
>>> the above algorithm is how it actually works.
>> i believe that people expect this:
>>
>> void foo (int a) {
>> import a;
>> a.bar(); // here we use 'a' module
>> xyzzy(); // it's actually 'a.xyzzy', and 'a as module' is
>> implicit
>> writeln(a); // here we use 'int a' argument
>
> Context dependent lookups? That's an awful lot more complex
> than the existing rules.
>
>> }
>>
>> i.e. symbol resolver will try argument/local name first, and
>> only if it
>> failed tries to search in module.
>
> That's how it does work. It's just that parameters are in an
> enclosing scope.
>
>
>> or, more complicated sample:
>>
>> struct A { int bar; int baz; }
>> void foo (in A a) {
>> import a;
>> a.bar(); // KABOOM, conflicting names
>> xyzzy(); // it's actually 'a.xyzzy', and 'a as module' is
>> implicit
>> writeln(a); // KABOOM (both module and arg are complex
>> types
>> writeln(a.baz); // it's ok until module 'a' doesn't have
>> 'baz'
>> }
>>
>> i'm not saying that this is how things *must* work, but this
>> is what
>> one excepts, i think.
>
> I have no idea how to even write such rules, let alone what
> kind of error messages to generate when the user does it wrong.
>
> I believe it is far better to have simple rules, easy to
> explain, and have a few awkward edge cases than having a
> terribly complex setup with special cases that nobody
> understands.
>
> For example, probably 3 people on the planet understand C++
> overloading rules (pages and pages of trivia). The rest just
> try things at random until it appears to work.
+1
We should simply do a lookup for local symbol, and if that fail,
imported symbols.
In that case, a should resolve as the parameter, all the time.
More information about the Digitalmars-d
mailing list