Jonathan M Davis:

* foreach_reverse is essentially redudant at this point (not to mention
confusing if combined with delegates), since we have retro.

retro() can't replace foreach_reverse until the front-end demonstrability produces asm code equally efficient. Loops _must_ be fully efficient, they are a basic language construct, this is very important. Even foreach() is sometimes not equally efficient as a for() in some cases...


* I hate C style struct initializers and would really like to see them go, but for reasons that I don't understand, people actually use them rather than using a proper constructor call,

For single structs I prefer D-style initialization.
But take a look at this code, if you replace those C-style initializers with D-style, even using aliases to shorten the code to single letters, that data section becomes more noisy:
http://rosettacode.org/wiki/Ray-casting_algorithm#D


* As for features that add little value, the first one that comes to mind is with. I think that I've used it all of once, and I don't think that I've seen
it in other people's code very often.

It's rather common in Pascal/Delphi programming. I use it now and then.

For a case where it's very handy see here, with an enumeration:
http://rosettacode.org/wiki/Stable_marriage_problem#Alternative_version


It's hard to grep for (since with is
used in comments quite often),

Try to search for "with(" or "with\s(", that are less common in normal text.


* Increasingly, I don't like UFCS. I think that in most cases, it complicates code for little value. And I _really_ don't like how it results in people flipping chains of a(b(c(d(5)))) calls into something like d(5).c().b.().a(). I
think that it makes the code way harder to read.

For me it makes that kind of code way simpler to read...


The code is completely backwards.

It means call d on 5, then call c on the result, then call b on the result, and then call a on the result. It's better than before :-)

Bye,
bearophile

Reply via email to