Shout out to D at cppcon, when talkign about ranges.

Jonathan M Davis via Digitalmars-d digitalmars-d at puremagic.com
Wed Oct 7 10:13:44 PDT 2015


On Wednesday, 7 October 2015 at 16:33:21 UTC, John Colvin wrote:
> On Wednesday, 7 October 2015 at 14:59:28 UTC, Trass3r wrote:
>> On Tuesday, 6 October 2015 at 22:39:01 UTC, Ulrich Küttler 
>> wrote:
>>> Yes, this is an explanation. Thanks. So the argument being 
>>> C++ customs. Now that you mention it, this seems to be the 
>>> argument in Eric's D4128 paper, too.
>>>
>>> I was hoping for a somewhat deeper reasoning. Out of 
>>> curiously, I am still trying to grasp all the implications. 
>>> Ranges are hard.
>>
>> Another one is "odd number of iterators algorithms"
>>> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4128.html#appendix-3-d-ranges-and-algorithmic-complexity
>>> D’s choice of algorithmic basis operations is inherently less 
>>> efficient than C++’s.
>
> Hmm. That seems really contrived and/or missing the point. You 
> would never design a function like that for use with ranges, 
> but that doesn't mean you're any less able to efficiently find 
> word boundaries using ranges.

As I understand it, there are algorithms that inherently need 3 
iterators to do whatever is they do, and the question of how to 
deal with them has come up before in the newsgroup. I think that 
it's pretty clear that such algorithms are relatively few in 
number, but they do exist, and solving them with ranges does get 
potentially awkward. Similarly, using iterators with containers 
when you have to pass them to the container generally works 
better than ranges do. We've had to add overloads to  the 
std.container types which take the results of the various take 
functions in order to work around that problem. So, there are 
clearly cases where ranges become awkward and iterators aren't.

On the other hand, when dealing with algorithms, ranges tend to 
be far cleaner - especially when you need to chain them. And they 
tend to form a better basis of how to think about algorithms 
(even when dealing with iterators, you pretty much have to think 
in terms of ranges on some level at least). And ranges handle 
laziness far better than iterators do. So, I'm not the least bit 
convinced that iterators are a better way to go (quite the 
opposite), and I'm not convinced that trying to mix iterators and 
ranges is at all a good idea. But I do think that it's clear that 
using only ranges is not without its downsides, and since we're 
the first folks to seriously use ranges heavily in a language or 
standard library, we're bound to be making mistakes due to 
inexperience. At this point, I would guess that trying to mix 
iterators and ranges is just going to over-complicate things in 
an already over-complicated language, but it may actually be a 
big win for the C++ folks. We'll have to wait and see.

If we _were_ to look at doing something more than straight 
ranges, we'd probably look more at something like Steven's 
cursors than adding iterators, though I think that there's a 
decent chance that that only really helps with containers (it's 
been a while since I looked at what he did with cursors, and I 
really don't remember the details), though for the most part, I 
think that containers are the primary place where ranges tend to 
get annoying. Algorithms where they're problematic do exist, but 
they seem to be rare.

- Jonathan M Davis


More information about the Digitalmars-d mailing list