On 6/2/13 9:20 AM, bearophile wrote:
Andrei Alexandrescu:
[1, 2, 3, 4].map!(n => n.writeln).reduce;
I have to shot this down for many reasons:
I think it's better to give that final function a different name (like
"consume" or something like that) because it's used for very different
purposes and it returns nothing. Re-using the name "reduce" doesn't
reduce the amount of Phobos lines of code, it doesn't make the user code
simpler to understand, it's more obscure because it's more semantically
overloaded, and it's not more easy to find in the documentation by the
future D users.
Au contraire, there are many advantages. Using "reduce" leverages a
well-understood notion instead of introducing a new one. There is less
need for documentation, motivation, and explanations. "Reduce with no
function simply spans the entire range." Builds on an already-eager
construct par excellence instead of adding a new one that must be
remembered and distinguished from the lazy constructs.
Actually my first thought when I saw consume() was to look up reduce,
thinking, "how do I reduce a range to nothing"? Because that's the goal.
Reduce is the obvious choice here.
Function names are not language keywords, packing different purposes
in the same name as "static" doesn't give any advantage, and only
disadvantages.
Strawman argument.
Andrei