Accessors, byLine, input ranges

Michel Fortin michel.fortin at michelf.com
Fri Jan 29 06:34:25 PST 2010


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'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.

-- 
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/




More information about the Digitalmars-d mailing list