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