how to skip the next (n) item & continue from (n+1) with a range ? e.g. in File(fn).byLine();

mw mingwu at gmail.com
Mon Jun 22 21:37:51 UTC 2020


On Monday, 22 June 2020 at 20:58:58 UTC, Ali Çehreli wrote:

> Others have other explanations for this but my understanding is 
> about exception safety: If it changed internal state and 
> returned the front object, you would no be able to make a 
> function like popFront() strongly exception safe. (There are 
> ample documentation for this topic in C++ circles.)

That's one consideration. But, it will be more interesting in 
knowing (based on actual usage):

(a) how many bugs % are due to exception un-safe
(b) how many bugs % are due to front / popFront separation?

And which is more bug-prone for a typical programmer? my gut 
feeling is (b), at least we just saw one in this thread.


And

-- loop thru a static structure content like a simple array, why 
we need to worry about exception safe?

-- loop thru dynamically generated content, esp. network or more 
external complex structure may worth considering exception 
safety. But even there, do people always need to call 
!range.empty() check first? when it's not empty, how much more 
exception un-safety that popAndReturnFront() can introduce than 
the combination of `front(); ...; popFront();"?

And why not provide a popAndReturnFront(), and let the user 
decide based on his/her own actual usage?

> Another reason is cohesion: We want functions to have as little 
> responsibility as possible (ideally single).

Again we have to weight which way is more bug-prone, any actual 
statistics on the above (a) v.s (b)?


> > (or do we have another function for this)?
>
> There are many useful functions in std.range:
>
>   https://dlang.org/phobos/std_range.html
>
> The "take" and "drop" functions may be useful.

Use these functions inside a while(!range.empty()) {...} can only 
introduce more code complexity.



More information about the Digitalmars-d-learn mailing list