Metaprogramming in D : Some Real-world Examples

Tomas Lindquist Olsen tomas.l.olsen at gmail.com
Thu Nov 12 10:46:18 PST 2009


On Tue, Nov 10, 2009 at 1:27 AM, Bill Baxter <wbaxter at gmail.com> wrote:
> On Mon, Nov 9, 2009 at 4:09 PM, Walter Bright
> <newshound1 at digitalmars.com> wrote:
>> Looks like Bill Baxter is giving a presentation on D Nov. 18!
>>
>> http://www.nwcpp.org/
>
> Yep, that's right, and I'd be quite grateful to you smart folks here
> if you could share your meta-programming favorites with me!   If
> you've got a real-world example of meta-programming in D that you
> think is particularly handy, then please send it my way
>
> I'm looking for small-but-useful things that are easy to explain, and
> make something easier than it would be otherwise.  Things like places
> where static if can save your butt,  or loop unrolling,  and passing
> code snippets to functions like in std.algorithm.
>
> Things like a compile-time raytracer or regexp parser (though quite
> cool!) are not what I'm after.  Too involved for a short talk.
>
> --bb
>

I think tuples are a good example of something that makes your life
easier, lately I've been very fond of this little snippet:

>>>>>>>>>>>>>>>>>>>>>>

void delegate() Bind(Args...)(void delegate(Args) dg, Args args)
{
    struct Closure
    {
        Args arguments;
        void delegate(Args) callee;
        void call()
        {
            callee(arguments);
        }
    }

    auto c = new Closure;

    // foreach not strictly necessary, but ldc currently chokes on
just an assignment... I should fix that..
    foreach(i,a;args)
        c.arguments[i] = a;
    c.callee = dg;

    return &c.call;
}

class C
{
    void foo(int,float) {}
}

void main()
{
    auto c = new C;
    auto dg = Bind(&c.foo, 1, 2.0f);
    // register delegate somewhere
}

<<<<<<<<<<<<<<<<<<<<<<<<

Not sure if this gets easier in C++0x , haven't read up on that...

Nothing fancy, but it sure has made my life easier.

-Tomas


More information about the Digitalmars-d-announce mailing list