On Tue, 11 Feb 2014 19:48:40 -0000, Jesse Phillips <jesse.k.phillip...@gmail.com> wrote:

On Tuesday, 11 February 2014 at 10:10:27 UTC, Regan Heath wrote:
Things like this should "just work"..

File input ...

auto range = input.byLine();
while(!range.empty)
{
  range.popFront();
  foreach (i, line; range.take(4))  //Error: cannot infer argument types
  {
    ..etc..
  }
  range.popFront();
}

Tried adding 'int' and 'char[]' or 'auto' .. no dice.

Can someone explain why this fails, and if this is a permanent or temporary limitation of D/MD.

R

In case the other replies weren't clear enough. A range does not have an index.

It isn't *required* to (input/forward), but it could (random access). I think we even have a template to test if it's indexable as we can optimise some algorithms based on this.

What do you expect 'i' to be? Is it the line number? Is it the index within the line where 'take' begins? Where 'take' stops?

If I say take(5) I expect 0,1,2,3,4.  The index into the take range itself.

The reason I wanted it was I was parsing blocks of data over 6 lines - I wanted to ignore the first and last and process the middle 4. In fact I wanted to skip the 2nd of those 4 as well, but there was not single function (I could find) which would do all that so I coded the while above.

There is a feature of foreach and tuple() which results in the tuple getting expanded automatically.

And also the opApply overload taking a delegate with both parameters.

byLine has its own issues with reuse of the buffer, it isn't inherent to ranges. I haven't really used it (needed it from std.process), when I wanted to read a large file I went with wrapping std.mmap:

https://github.com/JesseKPhillips/libosm/blob/master/source/util/filerange.d

Cool, thanks.

R

--
Using Opera's revolutionary email client: http://www.opera.com/mail/

Reply via email to