On Monday, 18 January 2016 at 15:36:09 UTC, Manu wrote:
One more time...

Assuming:
void func(const CustomString &s1, const CustomString &s2);
void func(ref const(CustomString) s1, ref const(CustomString) s2);

C++:
  func("hello", "world");

D:
  auto dumb_name = CustomString("hello");
  auto another_dumb_name = CustomString("world");
  func(dumb_name, another_dumb_name);

I _hate_ this. Almost every line of my current project's non-systems
code looks like this.
The majority of the code I'm working with is event handlers and glue logic, which looks like this. Tons of 1 liners and glue. D code is much larger by volume, and much less readable than C++. The statement above has about a 1/8 signal to noise ratio, and this is actually understated; I have a lot of functions that take 4 strings like that! This problem extends well beyond strings, but it's a classic example.

The main advantage of D is modules, slices, forward referencing and compile times, but I'm seeing trade off of much less efficient code density/brevity for those advantages. D has a meta advantage, but I'm writing C++11/14 code now which is *almost* sufficient, so that advantage is quite diminished in 2016.


In general, I'm finding it hard to do anything useful in this project without C++ style implicit conversions. Compared to C++ code, I'm finding D becomes riddled with explicit constructor calls and terrible stack variable names where C++ implicit construction/conversion would
normally kick in.
This becomes more awkward in some generic function situations, but it's especially painful (queue broken record) passing such rvalues to
ref-args.
There is truly nothing else in D that has caused so much unrelenting grief as not being able to pass an rvalue to ref const(T). If we are never to get a scope-like solution, then consider supporting C++ style rval->const ref, as a pure practicality. It's been long enough, like,
7 years or something I've been waiting.

So, where are we heading with this? I raise this a couple of times a year. In 6 years, after a lot of talk (and various rejected proposals), as far as I can tell, we aren't any closer to a plan.

In my experience, this has always been and remains the biggest
practical annoyance writing D code, _by far_. It affects a very high
number of my lines of code, of all kinds.
What I don't get is, why does this seem to be unique to me? Perhaps it's because one common thread among almost all my D applications, is that I'm working together with C/C++. I can't transition to D unless I can work effectively against existing/established code. That's all
I've been trying to do for this past 6-7 years, and I'm yet to
successfully produced an acceptable transition path in my years of trying. This remains a very significant contributor to that failure.
How are we going to resolve this?
Nobody will want to transition if their code gets plainly worse, from
a basic practical standpoint.

There was this pull request which implemented `auto ref` for non-template functions: https://github.com/D-Programming-Language/dmd/pull/4717

But it was closed. I can't remember the exact reason why.

Reply via email to