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