RFC on range design for D2

Jason House jason.james.house at gmail.com
Mon Sep 8 21:46:38 PDT 2008


Left and right Union and diff seem awkward. The kind of thing a rare user would look up *every* time they use it or read code with it. I will make one observation: requiring one range inside of the other leads to three logical ranges:
• All elements "left" of the inner range
• All elements "right" of the inner range
• The inner range

In my mind that corresponds to "less than", "greater than", and "equal to".

Using this thought, here's how I think of the four awkward operations:
LeftDiff: <
LeftUnion: <=
RightUnion: >=
RightDiff: >

Maybe this could be done with some magic like r.range!(">=")(s)...

I hope this is clear. Long posts are tough to type on my cellphone...

Andrei Alexandrescu Wrote:

> Hello,
> 
> 
> Walter, Bartosz and myself have been hard at work trying to find the 
> right abstraction for iteration. That abstraction would replace the 
> infamous opApply and would allow for external iteration, thus paving the 
> way to implementing real generic algorithms.
> 
> We considered an STL-style container/iterator design. Containers would 
> use the newfangled value semantics to enforce ownership of their 
> contents. Iterators would span containers in various ways.
> 
> The main problem with that approach was integrating built-in arrays into 
> the design. STL's iterators are generalized pointers; D's built-in 
> arrays are, however, not pointers, they are "pairs of pointers" that 
> cover contiguous ranges in memory. Most people who've used D gained the 
> intuition that slices are superior to pointers in many ways, such as 
> easier checking for validity, higher-level compact primitives, 
> streamlined and safe interface. However, if STL iterators are 
> generalized pointers, what is the corresponding generalization of D's 
> slices? Intuitively that generalization should also be superior to 
> iterators.
> 
> In a related development, the Boost C++ library has defined ranges as 
> pairs of two iterators and implemented a series of wrappers that accept 
> ranges and forward their iterators to STL functions. The main outcome of 
> Boost ranges been to decrease the verboseness and perils of naked 
> iterator manipulation (see 
> http://www.boost.org/doc/libs/1_36_0/libs/range/doc/intro.html). So a 
> C++ application using Boost could avail itself of containers, ranges, 
> and iterators. The Boost notion of range is very close to a 
> generalization of D's slice.
> 
> We have considered that design too, but that raised a nagging question. 
> In most slice-based D programming, using bare pointers is not necessary. 
> Could then there be a way to use _only_ ranges and eliminate iterators 
> altogether? A container/range design would be much simpler than one also 
> exposing iterators.
> 
> All these questions aside, there are several other imperfections in the 
> STL, many caused by the underlying language. For example STL is 
> incapable of distinguishing between input/output iterators and forward 
> iterators. This is because C++ cannot reasonably implement a type with 
> destructive copy semantics, which is what would be needed to make said 
> distinction. We wanted the Phobos design to provide appropriate answers 
> to such questions, too. This would be useful particularly because it 
> would allow implementation of true and efficient I/O integrated with 
> iteration. STL has made an attempt at that, but istream_iterator and 
> ostream_iterator are, with all due respect, a joke that builds on 
> another joke, the iostreams.
> 
> After much thought and discussions among Walter, Bartosz and myself, I 
> defined a range design and reimplemented all of std.algorithm and much 
> of std.stdio in terms of ranges alone. This is quite a thorough test 
> because the algorithms are diverse and stress-test the expressiveness 
> and efficiency of the range design. Along the way I made the interesting 
> realization that certain union/difference operations are needed as 
> primitives for ranges. There are also a few bugs in the compiler and 
> some needed language enhancements (e.g. returning a reference from a 
> function); Walter is committed to implement them.
> 
> I put together a short document for the range design. I definitely 
> missed about a million things and have been imprecise about another 
> million, so feedback would be highly appreciated. See:
> 
> http://ssli.ee.washington.edu/~aalexand/d/tmp/std_range.html
> 
> 
> Andrei



More information about the Digitalmars-d-announce mailing list