std.algorithm.joiner unexpected behavior
Sergei Degtiarev via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Sep 2 18:43:33 PDT 2017
Let me clarify, what I was going to create was a small utility,
analogous to Perl <> operator, taking a list of file names and
allowing forward iteration as it would be single stream of text
lines. It would take no time to write the range from scratch, but
what are all the phobos primitives for then? So it looks like
this:
auto catFiles(string[] args)
{
File[] files=args.map!(a => File(a)).array;
if(files.empty)
files~=stdin;
return joiner(files.map!(a => a.byLine));
}
but unfortunately it does not work.
It seems, everybody agreed the problem is likely in the line
buffer reused, however, replacing .byLine() with .byLineCopy()
yields same result. Also, neither .byLine() nor .byLineCopy()
return ForwardRange, just InputRange, so no .save() is probably
called on them. And last, the utility is supposed to be fast, so
using .byLineCopy() is very undesirable. Transient ranges may be
uneasy to handle, but they allow to retain status of D as "better
C" suitable for system programming. Using unsolicited internal
copies is more typical for high-level scripting languages, and is
one of the reasons of slower execution and high memory
consumption.
In short, I agree with your arguments, but still believe this is
a bug, probably in joiner rather than in .byLine(). I'm going to
take look at the code and will tell if find anything.
Thank you for the discussion.
More information about the Digitalmars-d-learn
mailing list