Transient ranges
Seb via Digitalmars-d
digitalmars-d at puremagic.com
Fri May 27 16:42:24 PDT 2016
A couple of weeks ago on the next/shift convenience wrapper
discussion [1], there was a nice discussion about transient
ranges. It didn't come to a conclusion, so let's revie it. I just
cite the best three quotes from the thread as a summary:
jmdavis:
> The reality of the matter is that ranges with a transient front
> tend to break if you do much more than use foreach on them.
> They don't even work with std.array.array
schveiguy:
> There is an implicit expectation that if you assign the front
> of a range to something, it's going to last forever, because
> many ranges do actually behave that way. But the range contract
> does not guarantee that, it just happens to work.
quickfur:
> isTransient can only be implemented if the range implementor
> defines its value. There is no way to know whether a range is
> transient or not just by looking at its type and the signatures
> of front, popFront, etc.. Having said that, though, since
> transient ranges are generally the exception rather than the
> norm, we could adopt a convention that transient ranges declare
> themselves thus by defining a .transient enum member or
> something like that, and have isTransient return false if a
> range doesn't have such a member.
> On a related note, there are a good number of Phobos algorithms
> that do not work on transient ranges at all, because
> internally they (blindly) assume that assigning the value of
> .front to a local variable will retain its original value after
> popFront is called. I've fixed a couple of places where this
> happens, but I'm almost certain many other places haven't been
> fixed yet, and in some cases, cannot be fixed without
> restricting the algorithms to forward ranges only rather than
> input ranges. Some things simply cannot be implemented without
> copying .front somehow, and the only way to do this reliably
> with the current API is to require forward ranges and use save
> to keep track of the previous position of the range.
So what about the convention to explicitely declare a
`.transient` enum member on a range, if the front element value
can change?
[1] https://github.com/dlang/phobos/pull/4010
More information about the Digitalmars-d
mailing list