Metaprogramming in D : Some Real-world Examples

Tomas Lindquist Olsen tomas.l.olsen at gmail.com
Fri Nov 13 11:38:15 PST 2009


On Thu, Nov 12, 2009 at 8:24 PM, Bill Baxter <wbaxter at gmail.com> wrote:
> On Thu, Nov 12, 2009 at 10:46 AM, Tomas Lindquist Olsen
> <tomas.l.olsen at gmail.com> wrote:
>> 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...
>
> I think it does.  C++0x has variadic templates.  And some kind of
> lambdas/closure thing.  So probably it can do something similar.
> Anyway, the meta- aspect of Bind seems kinda weak.  Certainly a nice
> use of variadic templates and closures, though.
>
> --bb
>

Just read the Wikipedia entries on Metaprogramming and
Template_metaprogramming, I guess I wasn't really aware of the
difference.
Seems a lot harder to come up with small real-world snippets of the former.


More information about the Digitalmars-d-announce mailing list