Proposal to deprecate "retro.source"

monarch_dodra monarchdodra at gmail.com
Thu Nov 8 13:08:11 PST 2012


On Thursday, 8 November 2012 at 18:20:31 UTC, Jonathan M Davis 
wrote:
> On Thursday, November 08, 2012 10:56:38 monarch_dodra wrote:
>> On Thursday, 8 November 2012 at 09:18:54 UTC, Jonathan M Davis
>> 
>> wrote:
>> > In the case of retro, I think that it would good to have 
>> > source
>> > exposed for
>> > std.container's use. It's easy for std.container to 
>> > understand
>> > what retro's
>> > supposed to do, and use it accordingly, and I think that it
>> > would be silly for
>> > it have to call retro on the retroed range to do that. I do
>> > agree however that
>> > in general, it doesn't make sense to access source.
>> 
>> Yes, accessing the original range is useful, but AFAIK, 
>> container
>> doesn't use retro in any way. It does it with take (which also
>> has a source field). For take, there is no way to extract the
>> source other than with a specialized function.
>
> std.container doesn't use retro right now, but it really should 
> (though that
> would require externalizing retro's return type). For instance, 
> what would you
> do if you had to remove the last five elemets from a DList? You 
> can't simply
> take the last 5 and pass that to remove with something like 
> take(retro(list[],
> 5)) or retro(take(retro(list[], 5))), because the resulting 
> type is
> unrecognized by remove. You're forced to do something like
>
> list.remove(popFrontN(list[], walkLength(list[]) - 5));
>
> which is highly inefficient.

It's funny you bring this up, because I've been wrapping my head 
around this very problem for the last week. The root of the 
problem is that Bidirectional ranges (as *convenient* as they 
are) just don't have as much functionality as iterators or 
cursors. If you've used DList more than 5 minutes, you know what 
I'm talking about.

The "retro" trick you mention could indeed be a convenient 
mechanic. (Keep in mind that take is forward range, so can't be 
retro'ed though).

I'm just afraid of what it would really mean to interface with a 
retro'ed range: What exactly does that range represent for the 
original container?

What we'd *really* need (IMO) is a takeBack!Range, that would 
only implement back/popBack. No, the resulting range wouldn't 
*actually* be a range (since it wouldn't have a front), but it 
would still be incredibly useful even if *just* to interface with 
containers, eg:

list.remove(list[].takeBack(5)); //Fine, that's not a "real" 
range, but I know how to interface with that.

I'll toy around with this in my CDList implementation.

----
PS: The problem you bring up is common to all bidirRanges, and 
not just containers: As a general  rule, there is no way to 
extract a subrange from the end of a bidirrange...

> [SNIP]*The rest*[/SNIP]
>
> - Jonathan M Davis

Read and acknowledged.


More information about the Digitalmars-d mailing list