Modifying user-defined attributes. UDA templates.

Dicebot public at dicebot.lv
Mon Mar 17 11:47:43 PDT 2014


Hello Yuriv,

Currently declarative meta-programming is somewhat special in D 
compared to dynamic languages like python in a sense that all 
language entities are actually immutable. You can use those as a 
base for code generation but can't re-write existing symbols - 
this is a very basic property of the language and I highly doubt 
this will be ever changed (I would have been among first 
protesters, actually).

That means that you need to organize your code differently to 
achieve similar usability in D. Two main patterns I am aware of:

1)
Apply UDA's in context of some compile-time framework and put any 
modifications to be done on calling side while preserving actual 
function / class signatures as-is.

For example, when vibe.d REST interface is annotated with 
@rootPathFromName, it does not actually change anything in 
interface but indicates to route generation comile-time algorithm 
that it should be processed differently. In all other contexts 
interface still can be used as it has no UDA attached.

2)
Use a private symbol as an input to generate actual public one. 
Something like this:

@SomeUDA
private class MyClassImpl
{
     // ...
}

// `generate` being some templated CTFE function that used 
reflection to
// build code of new public class to mixin (with a name "MyClass")
mixin(generate!(MyClassImpl, "MyClass"));

There are several common utilities missing in Phobos to make such 
coding style much easier but will definitely improve in that 
regard ;)

One example of function attribute implementation somewhat similar 
in spirit to Python decorators I have written for vibe.d : 
https://github.com/rejectedsoftware/vibe.d/blob/master/source/vibe/internal/meta/funcattr.d

I will also be speaking on this topic on upcoming DConf.


More information about the Digitalmars-d mailing list