Meta-programming - examples
kris
foo at bar.com
Sat Feb 10 20:51:41 PST 2007
janderson wrote:
> 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.
Thanks, very much. It's refreshing to see some concrete examples.
- Kris
More information about the Digitalmars-d
mailing list