On Monday, 22 July 2013 at 12:08:06 UTC, Nick Treleaven wrote:
Hi,
I remember an example in some slides by Walter which had this snippet (slightly simplified):

stdin.byLine.map!(l => l.idup).array

Someone commented in a reddit post that the idup part was not intuitive (can't find the link now, sorry).

I made a pull request to re-enable using byLine!(char, immutable char). (Note this compiled in the current release, but didn't work properly AFAICT. It did work by commit 97cec33^).

https://github.com/D-Programming-Language/phobos/pull/1418

Using that allows us to drop the map!(l => l.idup) part from the above snippet. The new syntax isn't much better, but it can also be more efficient (as it caches front). I have an idea how to improve the syntax, but I'll omit it for this post.

I've since thought that if most or all lines in a file need to be persistent, it may be more efficient to use readText(filename).splitLines, because that doesn't need to allocate for each line.

There are two enhancements for that approach:
1. readText should accept a File, not just a filename, so we can use stdin. 2. splitLines makes an array. It would be more flexible to have an input range created from a function e.g. lineSplitter.

With these enhancements, we could change the byLine docs to recommend using File.readText.lineSplitter if most lines need to be persistent.

Thoughts?

I remember seeing Walter's component programming example and feeling that the idup stuck out like a sore thumb.

I like the idea. Makes simple programs even simpler without sacrificing performance by changing byLines. Ideally readText would take generic streams rather than Files but that will have to wait until std.io gets finished.

Reply via email to