Transient ranges

Dicebot via Digitalmars-d digitalmars-d at puremagic.com
Tue May 31 07:46:39 PDT 2016


On Monday, 30 May 2016 at 12:53:07 UTC, Steven Schveighoffer 
wrote:
> On 5/30/16 5:35 AM, Dicebot wrote:
>> On Sunday, 29 May 2016 at 17:25:47 UTC, Steven Schveighoffer 
>> wrote:
>>> What problems are solvable only by not caching the front 
>>> element? I
>>> can't think of any.
>>
>> As far as I know, currently it is done mostly for performance 
>> reasons -
>> if result is fitting in the register there is no need to 
>> allocate stack
>> space for the cache, or something like that. One of most 
>> annoying
>> examples is map which calls lambda on each `front` call :
>> https://github.com/dlang/phobos/blob/master/std/algorithm/iteration.d#L587-L590
>
> Maybe my understanding of your post is incorrect. You said "It 
> is impossible to correctly define input range without caching 
> front which may not be always possible and may have negative 
> performance impact."
>
> I'm trying to figure out which cases caching makes the solution 
> impossible.

There are two separate points here:

1) Current definition of input range (most importantly, the fact 
`front` has to be @property-like) implies `front` to always 
return the same result until `popFront` is called.

2) For ranges that call predicates on elements to evaluate next 
element this can only be achieved by caching - predicates are 
never required to be pure.

3) But caching is sub-optimal performance wise and thus bunch of 
Phobos algorithms violate `front` consistency / cheapness 
expectation evaluating predicates each time it is called (liked 
map).

>> I don't really care about concept of transient ranges, it is 
>> the fact
>> there is no guarantee of front stability for plain input 
>> ranges which
>> worries me.
>
> But this is inherent in languages which support mutable data. 
> If you want data that doesn't change, require copied/unique 
> data, or immutable data.

This has nothing to do with mutability, look at this totally 
broken example:

import std.random;
import std.algorithm;
import std.stdio;
import std.range;


void main ( )
{
	auto range = only(0).map!(x => uniform(0, 10));
	writeln(range.front);
	writeln(range.front);
	writeln(range.front);
}



More information about the Digitalmars-d mailing list