Printing shortest decimal form of floating point number with Mir
ag0aep6g
anonymous at example.com
Mon Jan 4 15:15:50 UTC 2021
On 04.01.21 15:44, Ola Fosheim Grøstad wrote:
> On Monday, 4 January 2021 at 14:40:31 UTC, ag0aep6g wrote:
>> You didn't replace "Bar!int" with "Foo!int". You replaced "Bar!T" with
>> "Foo!T". That's something else entirely.
>
> No, it isn't.
Of course it is. Replacing foo with bar is not the same as replacing baz
with qux. The resulting code is different. The compiler output is different.
My original post stands.
> When it is instantiated you get "Bar!int" and then the
> unification would substitute that with "Foo!int".
In `f(Bar!int());`, `Bar!int` is expanded to `Foo!int` before IFTI is
attempted. When `f` is instantiated, any mention of `Bar` is long
forgotten. The compiler sees the argument type as `Foo!int` (the type,
not the string "Foo!int"). From there it deduces `T` = `int` when the
parameter is `Foo!T x`, or it fails the instantiation when the parameter
is `Bar!T x`. Either way, there's no "Bar!int" anymore that would be
replaced by anything.
> This is basic type system design. Nothing advanced. Just plain regular
> unification.
As far as I understand, describing what DMD does as "unification" would
be a stretch. You might have a point saying that DMD should do "plain
regular unification" instead of the ad hoc, undocumented hacks it does
right now.
More information about the Digitalmars-d-announce
mailing list