Meta-programming - examples

janderson askme at me.com
Sat Feb 10 20:39:25 PST 2007


A couple of people have been asking questions about pseudo-real-life 
examples for the new compile time code aspects of D.  I ask this 
question for my interest as well.

Assuming that we have a good mechanism to process the input how could 
compile time code improve your every-day proficiency?  (This is 
specifically about the Mixin Expressions aspect).

I'll start with a few of my own.  Note my background is
game-programming.  In my experience, we care constantly creating tools 
to generate code because its impracticable to write and maintain it by hand.

Statemachine (and AI logic) written by design and coders are common in 
game programming.  Normally we have to fallback on a script language 
which is never as powerful.

mixin(statemachine(
"
	state FireAtEnemy
	{
		transition EnemyRange < 10
		{
			goto ChaseEnemy
		}
		transition FacingEnemy < .2
		{
			goto ChaseEnemy
		}
	}

	state ChaseEnemy
	{
		...
	}

");

You might imagine doing the above with if statement and arrays of 
delegates however designers have a much harder time with that.

3D Object rendering

//Render a 3D model.  For instance this may generate the vertexbuffers 
and textures directly into code, or may extract some of the data from 
the 3Dmodel.obj and load the rest at run-time.
mixin(renderModel(import("3Dmodel.obj")));

Transforming Textures
DXDtexture* texture = mixin(textureToD3D(import("3Dmodel.bmp")));

Simplify saving/loading of arbitrary structures.

//Only write this once.  Things are re-ordered for best fit in memory, 
localization ect...
mixin(Serailzable("Ship",
"
	struct Part
	{
		float firePower;
		char[] Model;
	}

	struct Ship
	{
		bool Friendly;
		Part Parts[];
	}
");

... Later

Load("Ship", "Ship.asset");

GUI -> not sure about this one as I can't come up with a format thats 
much neater then straight code. I'll post it anyways.

mixin(MyGUI(
"
	Button "OK", 10, 30
	{
		Exit;
	}
");

Multi-threading

The suggestion with multi-threading I came up with a little while ago:

int[] array ...
int result = 0;
mixin(threadIt(
"
	foreach(A a; array)
	{
		result += a;
	}
	combiner //If necessary?
	{
		result = result[0] + result[1];
	}
");

Compile time checking of code for coding standards or what have u:

mixin(CheckCode("

ect...


");
//Note that there should be a way to disable CheckCode in the general 
case to save compile time


There's heaps of other stuff, but that would make this post way to long.

Personally I see this new mixin format as giving us the power to extend 
D in whatever way meets our goals.  As Walter adds more features some of 
them will be rarely used (law of demising returns) because they are 
special case.  Mixin Expressions circumvent this because now the 
programmer has the power to create the language features they need.

The only downside I see is compile-time, which I hope can be solved with 
a smart caching system.



More information about the Digitalmars-d mailing list