On Tuesday, 22 November 2016 at 19:16:56 UTC, Ali Çehreli wrote:
On 11/22/2016 08:05 AM, Satoshi wrote:

I don't have extensive experience with other languages. In fact, the only other languages that I can claim proficiency are C and C++. (I also know Python just enough to find it incredible how it's used in the industry. Let's not get in to that discussion but I really tried and failed... in industry... :) ) Given that experience, I still find D a very useful tool.


D is one o the best languages what exists, it's reason why I'm using it. But some issues are solved better in other languages like rust, go or swift.


Agreed but it opens the door for bugs. Assuming

struct A { int a; }
struct B { int b; int c; }

void foo(int, int, int);

If foo(1, 2, 3) meant foo(A(1), B(2, 3)) today, it could silently mean foo(A(1, 2), B(3)) if one moved one member from one struct to the other.

Then there are other corner cases:

    writeln(1, 2, 3);

Should that print the integers or A(1) and B(2, 3)? It's always better to be explicit.


argument expand should be applied only to the last argument and cannot be used in variadic templates. Like in my simple example where I exactly know what function will do, but I want to call it by simplest way.

It actually works with classes, but no with structs.


import std.stdio;

struct Point {
    int x;
    int y;
}

struct GraphicsContext {
    static GraphicsContext current() {
        return GraphicsContext();
    }

    void moveTo(Point point) {
        writefln("Moving to %s", point);
    }

    void lineTo(Point point) {
        writefln("Drawing line to %s", point);
    }
}

void goTo(GraphicsContext gc, int x, int y) {
    gc.moveTo(Point(x, y));
}

void drawTo(GraphicsContext gc, int x, int y) {
    gc.lineTo(Point(x, y));
}

void main() {
    auto gc = GraphicsContext.current;
    gc.goTo(70, 70);    // <-- Clean syntax
    gc.drawTo(70, 170);
}

But I need to write overload function for every function taking simple messengers like Point/Size/Rectangle

Reply via email to