On Saturday, 30 June 2012 at 23:51:42 UTC, Andrei Alexandrescu wrote:
Yes. But now you're moving the goalposts because many of your arguments referred to SList.
I'm sorry, that's not what I meant to do. The goal post was not moved, rather misplaced to begin with. Using SList for making my point was not the best choice of containers. I'd hae used a "DList" like container if I had one.

On Saturday, 30 June 2012 at 23:51:42 UTC, Andrei Alexandrescu wrote:
Correct. take() and takeExactly() work under the assumption there's no surreptitious change in the structure of the range underneath. I think that's a reasonable decision.
Most of the time yes. But for certain "partitioning" algorithms, those that _cut_ a range into several subranges (for example "findSplit"), such "surreptitious" change should (IMO) be expected and supported.


On Saturday, 30 June 2012 at 23:51:42 UTC, Andrei Alexandrescu wrote:
Which is as it should be. How would you otherwise take the first n elements of a given doubly-linked list in constant time?
Constanst time, I don't know. I'm still looking for a way to do it in o(N) ;)


On Saturday, 30 June 2012 at 23:51:42 UTC, Andrei Alexandrescu wrote:
It's all about what it takes to reach a certain point. You are sensing something indeed, but take() is not it. The problem is there's no simple way to count 5 starting from the left side of a doubly-linked list, stop there, and then create a range from the beginning of the list and that mid point. In C++, that's trivial because range ends are separate.

----
I came to D after reading your talk on ranges, and I really liked (and am still enjoying) the concept. However, with C++, when you iterate over [First, Last), you are also creating a two new ranges: [First, Current) & [Current, Last). D doesn't provide that, it only provides a way to
shrink the current range and create [Current, Last).

Yes, that's a good way of putting it.

Using range, you don't get [First, Current). At best, you only get
a)A forward range only
b)A fixed size range
c)A range of another type

We could extend the range interface for specific ranges to allow for such. However, there hasn't been a strong need so far.


Andrei

Thanks again for your replies. I'm really enjoying using D and ranges, and I get that nothing is "free", and this issue is one of the by products of moving from iterators-pairs to more powerful, but restrictive, ranges.

I get the "no sense in making things more complicated if there is not a strong need", but at the same time, I've always felt that a language's algorithm facility should always we imaculate. Further more, it really feels as if the interface is just one concept shy of being able to make something like this work...

Something like...
"inverseRangeBegin(R big, R small)": Creates a range that begins where big starts, and ends where small starts. R must be at least bidirectional. small must be included inside big.

From an implementation point of view, I think any container, and even arrays, can do it. I pretty sure this is compeltly feasable. Just off the top of my head. I'm sure there are brighter thinkers out there that have put more thought into it.

Reply via email to