Amusing D facts: typesafe variadic arrays are lazy!

Jeremie Pelletier jeremiep at gmail.com
Tue Oct 13 14:05:56 PDT 2009


Andrei Alexandrescu wrote:
> Chris Nicholson-Sauls wrote:
>> downs wrote:
>>>
>>> Here is a funny consequence of this amusing fact:
>>>
>>> if you overload opAssign in a struct with lazy T[] dgs..., you can 
>>> achieve the following syntax
>>>
>>>
>>>>     WithFlag(GL_BLEND, true) = WithDepthMask(false) = tex.With = 
>>>> Quads = {
>>>>       foreach (i, q; qa) {
>>>>         float f = 1f*i / qa.length; Color(1f-f, f, 1f);
>>>>         TexCoord(0f, 0f); Vertex(q.points[0]);
>>>>         TexCoord(1f, 0f); Vertex(q.points[1]);
>>>>         TexCoord(1f, 1f); Vertex(q.points[3]);
>>>>         TexCoord(0f, 1f); Vertex(q.points[2]);
>>>>       }
>>>>     };
>>
>> That's... just beautiful...
>>
>> -- Chris Nicholson-Sauls
> 
> Not getting it... could someone please explain?
> 
> Andrei

 From what I get, he has something like this:

struct WithFlag(int OP, bool enable) {
	static void opAssign(T)(lazy T next) {
		static if(enable) glEnable(OP);
		else glDisable(OP);
		next();
	}
}

struct WithDepthMask(bool enable) {
	static void opAssign(T)(lazy T next) {
		glDepthMask(enable);
		next();
	}
}

struct Tex {
	void opAssign(T)(lazy T next) {
		glBindTexture(_tex);
		next();
	}
}

struct Quads {
	static void opAssign(T)(lazy T commands) {
		glBegin(GL_QUADS);
		commands();
		glEnd();
	}
}

I don't know if thats his exact code, but from what I can remember of gl 
from memory it should look like this.

Jeremie



More information about the Digitalmars-d mailing list