Herb Sutter's CppCon talk "Extending and Simplifying C++: Thoughts on Pattern Matching using `is` and `as`"
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Tue Nov 2 02:43:14 UTC 2021
On 11/1/21 9:18 PM, deadalnix wrote:
> On Monday, 1 November 2021 at 21:41:29 UTC, Walter Bright wrote:
>> On 11/1/2021 9:18 AM, deadalnix wrote:
>>> This part IMO, point at what the #1 problem with the way things have
>>> been done in D. D's feature just don't compose well because they
>>> aren't orthogonal with each other (and many are inconsistent).
>>
>> Can you be more specific?
>>
>
> Yes.
>
> There are so many of them it's hard to list them all. I'm going to
> glance over a bunch on the top of my mind, feel free to ask more about
> any one of them if you want me to expand deeper.
>
> 1. enum binary ops and final switch. final switch assume an enum take a
> finite set of values as declared in the enum, but many more value can be
> obtained using binary ops.
>
> 2. type qualifier and delegates. Because the type system doesn't track
> the type qualifier of its capture, it is possible to have immutable or
> shared data refers to thread local ones through a delegate.
>
> 3. type qualifier transitivity and templates. template will consider
> types with different qualifier as disjoint, which seems like they
> should, until you try to write a container library or try to get range
> to interract with type qualifier.
>
> This one is IMO the #1 problem with D, hands down. Nothing comes even
> remotely close. We don't have a decent set of collection to use because
> of it, and even worse, it's not even possible to write one.
>
> 4. Scope variables and closures. Closure capture sub scopes incorrectly.
> This is especially relevant in loops, because the variables captured are
> past their lifetime, leading to incorrect behaviors.
>
> 5. string autodecoding. The array type that behave like no other.
>
> 6. Identifier resolution and UFCS works prevent from effectively
> extending a type's behavior. This because as soon as the type is passed
> down to a template, then identifiers are now resolved in the template's
> context and all the UFCS extended interface becomes impossible to resolve.
>
> 7. Identifier resolution and mixin style codegen. mixin force a second
> round of identifier resolution, generated via T.stringof and alike, but
> these types may not resolve where the string is mixed in (for instance,
> when you mixin within a template).
>
> 8. 6 and 7 also do clash with visibility qualifiers, for the same
> reasons. Even when symbol resolve, they may end up being private.
>
> 9. Functional programming and attribute soup. Because it is not possible
> to define attribute in a way that depends to functions passed as
> argument, it is not possible to compose anything in a functional way
> without assuming that everything is impure, throw and uses the GC and more.
>
> This breaks inout in an unfixable manner as it becomes impossible to
> disambiguate:
>
> X foo(inout(Y) bar(...)) {} // Is the inout qualifier related to X or to
> bar's argument? Or both?
>
> 10. shared things are not constructible. dlang.org literally say you got
> to cast shared in and out, which is actually UB.
>
> 11. Function and first class function are different for no good reason.
> It's trivial to break a large portion of phobos by passing it functions
> that are not first class.
>
> 12. Sometime bool are integrals, sometime they aren't. Bonus point: one
> of the part of D that think bool are integral is DMD, and DMD won't
> hesitate to convert ints to bool if it can constant fold them into 0 or
> 1. But `isIntegral!bool` is false for instance.
>
> You will note that few of the above behavior are wrong per se. They are
> just different part of D making different assumptions about the
> underlying reality of D, which are often fine in isolation, but are
> mutually exclusive.
>
> For instance, there are good reasons for a bool to be an integral, and
> good reasons for it not to be. But there are no good reasons for DMD
> doig implicit conversion to bool as if was an integral, and
> `isIntegral!bool` being false. Each of them can be true, but both of
> them cannot be true at the same time.
>
> These are just a few that I can brain dump, but there are a ton more.
> I'd say except 3. that is the elephant in the room, the overall thing is
> more a death by a thousand cut rather than
I quote this post in its entirety because I so much agree with it. Each
of these issues is something that has been overlooked for decades.
More information about the Digitalmars-d
mailing list