Accessors, byLine, input ranges

Steven Schveighoffer schveiguy at yahoo.com
Fri Jan 29 06:49:08 PST 2010


On Fri, 29 Jan 2010 09:34:25 -0500, Michel Fortin  
<michel.fortin at michelf.com> wrote:

> On 2010-01-29 08:18:46 -0500, "Steven Schveighoffer"  
> <schveiguy at yahoo.com> said:
>
>> Hey, it's that dead horse again, let's beat it!
>>  Andrei and I and several others discussed this ad infinitum.  You  
>> will  never convince Andrei that his design is wrong :)
>
> Andrei is the one who complained that it's difficult to know whether  
> 'byLine' is a property in the first place. I'm just explaining why it  
> is, and what should be done.

I agree.

>
> I'm starting to think Anrei likes ambiguous semantics.  :-)
>
>
>> The truth is, the fact that byLine modifies stdin by its mere existence  
>>  proves to be inconsequential.  Nobody will fetch the byLine property   
>> without using it.  It's still an accessor.
>
> That's only true if you use byLine exclusively.
>
> Here is a case where the advance fetching of byLine could go wrong:
>
> 	// fetch 3 lines:
> 	string[] consume(3, stdin.byLine);
> 	// now fill a buffer
> 	ubyte[] buffer;
> 	buffer = stdin.rawRead(buffer);
>
> 	E[] consume(E, R)(int count, R range) {
> 		E[] elements;
> 		foreach (i; 0..count) {
> 			elements ~= range.front;
> 			range.popFront();
> 		}
> 		return elements;
> 	}
>
> The problem here is that the consume() function will in reality consume  
> 4 lines of stdin, even though it just take 3 from byLine.
>
> When we later call rawRead, a line has been lost.

Yeah, I am on your side.  byLine has some nuances that make it  
incompatible with other uses of the stream.  In fact, byLine might only be  
useful in processing the entire file.  Hm... opApply?

-Steve



More information about the Digitalmars-d mailing list