Beta 2.094.0
Steven Schveighoffer
schveiguy at gmail.com
Sun Sep 13 19:16:24 UTC 2020
On 9/13/20 2:33 PM, DlangUser38 wrote:
> On Sunday, 13 September 2020 at 17:51:49 UTC, Steven Schveighoffer wrote:
>> On 9/13/20 1:25 PM, MrSmith wrote:
>>> On Sunday, 13 September 2020 at 15:12:00 UTC, Steven Schveighoffer
>>> wrote:
>>>> The first part of the change seems disruptive. If you just fix the
>>>> second part (that you can now retrieve all members of std), doesn't
>>>> it fix the problem?
>>>>
>>>
>>> Main problem is that allMembers returns strings and you can't tell if
>>> member is an import from it. If it returned aliases then you could do
>>> is(m == module), etc.
>>
>> It's always been string, and should always be.
>>
>> But I don't know of another case where it returns something that can't
>> be passed to getMember. You should be able to use getMember on "std",
>> and then getMember on that with "stdio". Just like any other nested
>> thing.
>>
>> It would be just as confusing as if you had:
>>
>> struct S
>> {
>> int foo;
>> }
>>
>> and __traits(allMembers, mod) contained "S.foo".
>>
>> BTW, when I wrote that first response, I didn't realize that
>> __traits(allMembers, std) returns... a lot of stuff. the whole
>> mechanism seems like it doesn't do what I would expect.
>>
>
> Imports need to be fully qualified in the resulting tuple.
I can't think of any other case where getting allMembers returns
something other than an Identifier. It's super surprising that something
returned by allMembers is not actually a member of the thing you got it
from.
Arguably, NO imports that aren't renamed or aliased should be included
in the members.
> having `import std.stdio;` and just "std" in the tuple was a bug. I mean
> this is not an opinion it worked like that by error, the special case
> for imports was not considered so "std" slipped in the result while it
> should always have been "std.stdio".
Yeah, I don't know the intention originally. But I have definitely done
exactly what the thread author stated (used __traits(getMember) on all
the module to look for certain symbols). So my code would be broken too.
Essentially, when you don't care about imports, they get ignored even if
they were there by error. But when __traits(getMember) actually fails,
now it becomes a problem.
Honestly, I've never used __traits(allMembers, module) to look for
imports. Most likely many people don't, since it doesn't work how you
would ever expect. I'd rather we just got rid of that part of the output
than break code that doesn't care about imports, but does care about the
other things in the module. I don't want to have to write extra mixins
to rule this stuff out.
-Steve
More information about the Digitalmars-d-announce
mailing list