Revised RFC on range design for D2

Bruno Medeiros brunodomedeiros+spam at com.gmail
Thu Sep 25 12:29:35 PDT 2008


Andrei Alexandrescu wrote:
> Benji Smith wrote:
>> Andrei Alexandrescu wrote:
>>> In wake of the many excellent comments and suggestions made here, I 
>>> made one more pass through the draft proposal for ranges.
>>>
>>> http://ssli.ee.washington.edu/~aalexand/d/tmp/std_range.html
>>>
>>> There are some comments in red illustrating some uncertainties (not 
>>> all), and the names of the primitives have been updated. Bicycle shed 
>>> galore! But don't forget to comment on the reactor as well :o).
>>
>> Well done. I think the design has come together very nicely. I'm 
>> especially happy with all the new names, which make a big difference 
>> for me in being able to visualize how the proposal works. The old 
>> names (fromLeft, etc) were very opaque to me.
>>
>> (btw: head & toe? i love it!)
>>
>> In its current state, this actually gets me pretty excited about D2. 
>> Maybe even enough to finally slog my way through all the const stuff.
>>
>> One tiny typo, though: In the "Forward range" section, the code sample 
>> still uses "left" instead of "head".
> 
> Fixed, thanks.
> 
>> And, there are two sections (which I think are related to one another) 
>> that left me scratching my head:
>>
>> Input Ranges:
>> "In case ElementType!(R) has aliases (such as a reference, pointer, or 
>> array type), the iterator is free to recycle it it upon the call to 
>> r.next, so client code must do a deep copy if preserving the value is 
>> needed. [NOTE: This is a weakness in the design. A better way of 
>> figuring recycling should be found.] The call is defined only right 
>> after r.done returned false."
>>
>> Forward Ranges:
>> "Also, forward ranges iterate over "real" elements, which makes 
>> in-place mutation of r.head possible."
>>
>> Those paragraphs are completely greek to me. Can you elaborate?
> 
> Consider iterating over an array of int[], specifically an int[][]. Then 
> when you call r.head you see the current int[]. You can store it and use 
> it a few steps later or even after the iteration is done for as long as 
> the array is around.
> 
> Contrast that with iterating a file containing lines of integers. The 
> file has a buffer of type int[]. Every time you call r.next, the file 
> range reads a new line, parses the integers, and REFILLS the array with 
> them. If if generated a new array every line, that would cause a great 
> deal of allocations.
> 
> Same about the in-place thing. If you modify elements in the array, they 
> stay modified. If you modify the buffer of a file, your changes get 
> overwritten upon r.next.
> 
> 
> Andrei

How about having the element type of the 
file-containing-lines-of-integers range be const(int[]) instead of int[]?
I think it would solve the ownership problem, but it might introduce 
other problems, such as, how to make InputRange!(int[]) be covariant 
with InputRange!(const(int[]).

-- 
Bruno Medeiros - Software Developer, MSc. in CS/E graduate
http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D


More information about the Digitalmars-d-announce mailing list