On 12-Aug-12 03:29, Andrei Alexandrescu wrote:
N.B. I haven't yet reviewed the proposal.
There's been a lot of discussion about the behavior of hash
accumulators, and I've just have a chat with Walter about such.
There are two angles in the discussion:
1. One is, the hash accumulator should work as an operand in an
accumulation expression. Then the reduce() algorithm can be used as
follows:
HashAccumulator ha;
reduce!((a, b) => a + b)(ha, [1, 2, 3]);
writeln(ha.finish());
This assumes the hash overloads operator +.
Would have been nice to have operator '<-' for "place" *LOL* :)
(OT: I think C++ would be a much better place if it had it for e.g.
iostream ...)
I think we should reify the notion of finish() as an optional method for
output ranges. We define in std.range a free finish(r) function that
does nothing if r does not define a finish() method, and invokes the
method if r does define it.
Then people can call r.finish() for all output ranges no problem.
For files, finish() should close the file (or at least flush it -
unclear on that).
Easy to check:
{
File f = File("myfile", "w");
auto sink = f.lockingTextWriter;
dumpTo(sink, some_vars);
dumpTo(sink, some_other_vars);
sink.finish(); //would be taking on f's job to close file
return f; //and now what? clearly f is the one responsible
// (with the means to transfer that responsibility)
}
So IMO ranges should not step down to topology & origins of data be it
output range or input range. This also means that with streams, finish
is a flush and thus I'd expect finish to be callable many times in row.
Destroy!
One thing I don't like about it is a by-hand nature of it. Manual way is
good only when you are interested in the result of finish.
I half expect to see rule #X of D coding standard:
use RAI or scope(exit) to flush an output range
--
Dmitry Olshansky