Printing shortest decimal form of floating point number with Mir

Ola Fosheim Grøstad ola.fosheim.grostad at gmail.com
Mon Jan 4 15:13:14 UTC 2021


On Monday, 4 January 2021 at 15:03:05 UTC, jmh530 wrote:
> On Monday, 4 January 2021 at 14:40:31 UTC, ag0aep6g wrote:
>> On 04.01.21 15:37, Ola Fosheim Grøstad wrote:
>>> On Monday, 4 January 2021 at 14:11:28 UTC, ag0aep6g wrote:
>>>> `Bar!int` is an alias. It's indistinguishable from 
>>>> `Foo!int`. The code fails in the same manner when you 
>>>> replace "Bar!int" with "Foo!int".
>>> 
>>> 
>>> Wrong. This succeeds:
>>> 
>>>   struct Foo(T) {}
>>> 
>>>    alias Bar(T) = Foo!T;
>>> 
>>>    void f(T)(Foo!T x) {}
>>> 
>>>    void main() {
>>>      f(Bar!int());
>>>    }
>>
>> You didn't replace "Bar!int" with "Foo!int". You replaced 
>> "Bar!T" with "Foo!T". That's something else entirely.
>
> IMO, this is a better example, even if it's a little more 
> verbose.
>
> struct Foo(T) {}
>
> alias Bar(T) = Foo!T;
>
> void f(T)(Bar!T x) {}
>
> void main() {
>     auto x = Bar!int();
>     f(x);
> }

Also, the typesystem clearly sees the same type with two names, 
so there is no new nominal type (obviously):

   struct Foo(T) {}
   alias Bar(T) = Foo!T;

   static assert(is(Bar!int==Foo!int));

We are talking unification over complete types, unification over 
incomplete types would be more advanced... but this isn't that. 
We don't start unification until we have a concrete complete type 
to start working with.





More information about the Digitalmars-d-announce mailing list