protocol for using InputRanges
Marc Schütz" <schuetzm at gmx.net>
Marc Schütz" <schuetzm at gmx.net>
Sat Mar 29 14:02:30 PDT 2014
On Saturday, 29 March 2014 at 01:36:46 UTC, Steven Schveighoffer
wrote:
> On Fri, 28 Mar 2014 07:47:22 -0400, Marc Schütz
> <schuetzm at gmx.net> wrote:
>> On Thursday, 27 March 2014 at 16:12:36 UTC, monarch_dodra
>> wrote:
>>> If you initialized the next element in both constructor and
>>> popFront, then you'd get rid of both these checks.
>>>
>>
>> ... but of course lose laziness.
>
> In this case, laziness is not critical. Decoding the element is
> an O(1) operation, and when looping through, you will decode it
> anyway.
>
> When processing a 20 element string, the cost of checking to
> see if you have decoded on every empty or front call may
> override the front-loaded cost of decoding the first element on
> construction. It's sure to add to the cost if you are
> processing all 20 elements, since you decode them all anyway.
>
> On other ranges, it's more important when the first element
> costs a lot to fetch. HOWEVER, it's not critically important to
> delay that unless you are not going to process that element.
> For example, if you are foreach'ing over all the elements, the
> delay doesn't matter.
>
> I'd rather the higher level code decide whether to delay or
> not, depending on the situation. Requiring a protocol change
> for such detailed knowledge seems unbalanced.
I was more thinking of the fact that you need to read something
on construction, rather than on consumption, and this reading
might be noticeable. There was the example of
`stdin.byLine().filter(...)` (or something similar, don't
remember exactly), which reads from stdin on construction. This
changes the behaviour of the program, because the read operation
will (probably) block.
I'd suggest to make it a requirement for ranges and algorithms
_not_ to start consuming the underlying data until one of
empty/front/popFront is called, even if that has a negative
effect on performance. That's why I was asking for performance
numbers, to see whether there even is an effect. If there isn't,
that's just another argument for adding that requirement.
This is then, IMO, a very acceptable additional burden to place
on the writers of ranges. I agree, however, that it's not a good
idea to change the range protocol, i.e. what _users_ of ranges
have to abide by. That would be a breaking change, and it would
be an especially bad one because there I see no way to detect
that a user failed to call `empty` in an iteration if they knew
that there are more elements available.
More information about the Digitalmars-d
mailing list