Why is Phobos' isIntegral different from the built-in trait of the very same name?
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Sun Oct 17 19:19:31 UTC 2021
On 10/17/21 11:07 AM, Steven Schveighoffer wrote:
> On 10/17/21 10:36 AM, Andrei Alexandrescu wrote:
>> According to
>> https://github.com/dlang/phobos/blob/master/std/traits.d#L6191:
>>
>> =====
>> Detect whether `T` is a built-in integral type. Types `bool`, `char`,
>> `wchar`, and `dchar` are not considered integral.
>> =====
>>
>> Not considered by whom? Certainly they are considered by the language
>> per __traits(isIntegral). Also all conversion rules scream "they're
>> integral!"
>>
>> We even use the built-in trait to create a _different_ one!
>>
>> Why do we have a slightly different with no added usabilty in the
>> standard library?
>
> `isIntegral` dates back to D1, where `__traits` didn't exist. The
> current implementation is a "shorter" version of what was already there,
> without having to consider code breakage. This is the oldest thing I
> could find on github:
>
> https://github.com/dlang/phobos/commit/eec6be69edec9601f9f856afcd25a797e845c181#diff-b7918b17cede734a2dd4ecbf2a981d597a5978f52e02f9a3c6f53c9abd797f05R322-R327
>
>
> Note that this is an import from the old subversion repository, so
> attribution and PRs/etc. doesn't exist. You can keep looking on
> dsource.org if you want to find the original commit, but I'm almost
> positive it was Walter.
>
> I think the original didn't include bool/[w|d]char either by
> carelessness or a belief that these things really shouldn't be integers
> (a great irony considering the contemporary pushback from Walter against
> splitting bool out from the integral family).
>
> Things like this should have never been done, but now we have to live
> with it. Honestly, if we want to fix it, I would rather have the
> language enforce what std.traits says. So many problems happen by
> allowing e.g. integer promotion from `char` to `dchar`.
Interesting, thanks. I saw there's plenty of other isXxx that differ
from their built-in counterparts, perhaps with similar histories. I may
have written some of that code.
As a pattern, I note just how complex the type system is and how many
special cases there are:
* "alias this" shrapnel is all over the place. We should simply state
that phobos does not support "alias this" at all. Do conversions on the
call side.
* __vector just sticks its nose in random places.
* There's a lot of effort to legitimize enum as a seamless part of the
type system - sadly it's not seamless at all.
More information about the Digitalmars-d
mailing list