tardy v0.0.1 - Runtime polymorphism without inheritance

Atila Neves atila.neves at gmail.com
Tue Jun 16 13:31:49 UTC 2020


On Tuesday, 16 June 2020 at 12:30:24 UTC, jmh530 wrote:
> On Tuesday, 16 June 2020 at 11:31:14 UTC, Atila Neves wrote:
>> On Tuesday, 16 June 2020 at 11:24:05 UTC, jmh530 wrote:
>>> On Tuesday, 16 June 2020 at 09:15:10 UTC, Atila Neves wrote:
>>>> [snip]
>>>>> In the more longer-term, is the goal of the project to 
>>>>> implement a Typescript / Go interfaces like structural type 
>>>>> system in user space?
>>>>
>>>> Yes. Other than allowing multiple interfaces, I think it's 
>>>> already implemented.
>>>
>>> I'm not familiar with what Typescript does, but doesn't Go 
>>> allow interfaces to be implemented by free-standing functions?
>>
>> So does tardy.
>
> Sorry, I had not realized that. I took Go's interface example 
> and converted it to D. Would this work with tardy?

<snip>

With a few changes, yes (added missing semicolons, changed 
IGeometry to Geometry in `measure`, passed the current module so 
tardy can find the UFCS functions, added `@safe pure` to the UFCS 
functions:


import tardy;

interface IGeometry
{
     double area() @safe pure const;
     double perim() @safe pure const;
}
alias Geometry = Polymorphic!IGeometry;

struct Rect {
     double width, height;
}

struct Circle {
     double radius;
}

double area(Rect r) @safe pure {
     return r.width * r.height;
}

double perim(Rect r) @safe pure {
     return  2 * r.width + 2 * r.height;
}

double area(Circle c) @safe pure {
     import std.math: PI;
     return PI * c.radius * c.radius;
}

double perim(Circle c) @safe pure {
     import std.math: PI;
     return 2 * PI * c.radius;
}

void measure(Geometry g) {
     import std.stdio: writeln;
     writeln(g);
     writeln(g.area);
     writeln(g.perim);
}

void main() {
     auto r = Rect(3.0, 4.0);
     auto c = Circle(5.0);

     Geometry.create!__MODULE__(r).measure;
     Geometry.create!__MODULE__(c).measure;
}






More information about the Digitalmars-d-announce mailing list