getNext
Mehrdad
wfunction at hotmail.com
Mon Jul 9 12:19:46 PDT 2012
On Monday, 9 July 2012 at 18:33:26 UTC, jerro wrote:
> On Monday, 9 July 2012 at 16:22:05 UTC, Mehrdad wrote:
>> Perhaps if you could show an actual example of what you expect
>> to be able to do, that would make things clearer?
>
> It is useful to be able to write an algorithm that both reads
> and writes range elements. There are plenty of use cases for
> that, but if you really need an example, here's a simple one:
>
> void transform(alias f, R)(R r)
> if(isInputRange!R && hasAssignableElements!R)
> {
> for(; !r.empty; r.popFront())
> r.front = unaryFun!f(r.front);
> }
Wow, thanks a bunch. That makes it a LOT more clearer than
explanations. :)
The trouble here is that the use case is valid, but the design of
ranges doesn't really match it.
Why? Because the way it currently stands, isInputRange &&
hasAssignableElements is basically isOutputRange (with also input
capability), which doesn't make any sense.
What we really need is to define a new kind of range -- perhaps
an "input/output range", if I had to name it: it's forward-only,
but it can be mutated and replaced. It'd be a superset of both
input and output ranges, and also a subset of bidirectional
ranges.
But without formally defining a new kind of range, we're just
saying "I want an input range that's also kinda-sorta an output
range. Ooh, I also want to be able to mutate it! But I can't seek
backwards, so it's not bidi. Hmm, not sure what to call it, so
I'll just put constraints for everything I need and hope it makes
sense."
It (obviously) /works/, but it doesn't make sense semantically,
the way it's defined right now.
More information about the Digitalmars-d
mailing list