Phobos usability with text files
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Mon Dec 27 10:54:35 PST 2010
On 12/26/10 11:53 AM, Michel Fortin wrote:
> On 2010-12-26 12:13:41 -0500, Andrei Alexandrescu
>> Generally I think buffer reuse in byLine() is too valuable to let go.
>
> I also agree it's wasteful.
>
> But I think bearophile's experiment has illustrated two noteworthy
> problems. The first issue is that calling filter! on the
> already-consumed result of byLine() gives you a seg fault. I reproduced
> this locally, but haven't pinpointed the problem.
That should be filed as a Phobos bug. Could you please do the honors?
> The second one is this:
>
> array(file.byline())
>
> which gives a wrong result because of the buffer reuse. Either it should
> not compile or it should idup every line (both of which are not entirely
> satisfactory, but they're better than getting wrong results).
I agree it would be great if that meaningless expression wouldn't compile.
> I think a range should be able to express if the value can be reused or
> not. If the value can't be reused, then the algorithm should either not
> instantiate, or in some cases it might create a copy.
I thought a couple of days about this. There's a host of desirable
properties that could ideally be expressed during compilation. My
experience is that inevitably they add complexity to the range
definition. For example, we could define a trait like this:
template iteratesDistinctObjects(R) if (isInputRange!R) {
enum iteratesDistinctObjects = true;
}
That would cover the common case, then the ByLine range would say:
template iteratesDistinctObjects(R) if (is(R == ByLine)) {
enum iteratesDistinctObjects = false;
}
That means all existing ranges and algorithms need to be reviewed to
take that property into account. The complexity of the library rises.
Even if we cover that, there are many properties like that, and user may
still define their own ranges, algorithms, or plain old code that do the
wrong thing in one way or another. So it all becomes a matter of
deciding at which point we can reasonably ask the library user to Read
The Fine Manual. I'm not sure where the decision about this particular
issue should be.
By the way, a simple way to define a range that issues one new string
per line is:
auto r = map!(to!string)(f.byLine());
Andrei
More information about the Digitalmars-d
mailing list