output ranges: by ref or by value?

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sat Jan 2 06:59:51 PST 2010


Michel Fortin wrote:
> On 2010-01-01 17:54:12 -0500, Andrei Alexandrescu 
> <SeeWebsiteForEmail at erdani.org> said:
> 
>> Michel Fortin wrote:
>>> What I'd do instead is somehow make input ranges non-copyable. They 
>>> could be either passed by ref or moved, never copied. This way they 
>>> would still behave exactly like array slices, only not copyable, and 
>>> you get a compile-time error if you try to copy them which is 
>>> infinitely better than a subtle change in behavior.
>>
>> I tried that, it makes input ranges next to unusable.
> 
> I think I can see why. You can't have ref member and local variables 
> like in C++, so it's pretty hard to use references.
> 
> 
>> save() is an imperfect but workable solution.
> 
> save() is an workable but error-prone solution.
> 
> Perhaps we could mitigate this by making people more aware of the 
> difference instead. Couldn't we rename "input range" for "input stream"?
> 
> Currently you have ranges that behave one way and ranges that behave the 
> other way, which is confusing. Having a different name for both would 
> emphasize there is a difference. With different names, you're guarantied 
> to get the "what's the difference?" question from newbies.
> 
> And it's simple to explain: "You can often use ranges and streams 
> interchangeably, but for that to work you must use save() when you need 
> a copy of the current state. Also, not all streams support save(). It's 
> good practice to always use save() so that algorithms work for both for 
> ranges and streams."

That's an idea, and names are powerful, but I think it's reasonable to 
not expect miracles from that name change. It has disadvantages too - 
"input range" vs. "forward range"  clarifies there's a conceptual 
relationship between the two, whereas "streams" are different from 
anything else.

Andrei



More information about the Digitalmars-d mailing list