Transient ranges
Seb via Digitalmars-d
digitalmars-d at puremagic.com
Sun May 29 09:43:02 PDT 2016
On Sunday, 29 May 2016 at 15:45:14 UTC, Joseph Rushton Wakeling
wrote:
> On Sunday, 29 May 2016 at 11:28:11 UTC, ZombineDev wrote:
>> On Sunday, 29 May 2016 at 11:15:19 UTC, Dicebot wrote:
>>> I would prefer such ranges to not have `front` and return new
>>> item from `popFront` instead but yes, I would much prefer it
>>> to existing form, transient or not. It is impossible to
>>> correctly define input range without caching front which may
>>> not be always possible and may have negative performance
>>> impact. Because of that, a lot of Phobos ranges compromise
>>> `front` consistency in favor of speed up - which only seems
>>> to work because most algorithms need to access `front` once.
>>>
>>> I believe this is biggest issue in D ranges design right now,
>>> by large margin.
>>
>> +1
>> I think making popFront return a value for transient ranges is
>> a sound idea. It would allow to easily distinguish between
>> InputRange and TransientRange with very simple CT
>> introspection. The biggest blocker is to teach the compiler to
>> recognize TransientRange types in foreach.
>
> I don't follow your reasoning here. In the proposal I put
> forward, if a range doesn't define `popFront()`, it's not an
> InputRange, it's a TransientRange.
>
> Conversely, if it _does_ define `popFront()`, it _is_ an
> InputRange.
>
> What's the problem with introspecting that?
Nothing. Just that it could lead to a lot of surprising mistakes,
currently the following yields an error:
struct A
{
auto front(){ ...}
enum empty = false;
}
A as;
foreach (a; as) {} // ERROR: no method popFront found
with the proposed change it would compile.
More information about the Digitalmars-d
mailing list