On 2012-03-16 14:35, Adam D. Ruppe wrote:
On the ride over here today, I had a thought that
I think neatly solves the user defined attribute
question.

I would love to have user defined attributes in D but I'm not completely like your approach. I would go with something more like Java annotations. This is how I would like user defined attributes to work.

Attributes can be applied to most declarations like: classes, fields, variables, functions, parameters and so on. Attributes are used with the following syntax:

@foo(key = "value", key2 = "value2) class Bar {}

"foo" is the name of the attribute. In the parentheses is a key-value list passed to the attribute. The values can be of any type available at compile time.

Attributes are defined as follows:

We add a new attribute called "@annotation" or "@attribute". This attribute is applied to a class or struct to make it an attribute:

@attribute class foo
{
    string key;
    string key2;
}

The keys the attribute accepts are declared in the class as either fields or methods (haven't decided yet). It's perfectly fine to have an attribute accepting no values which doesn't have to declare any keys:

@attribute class bar {}

If an attribute only accepts one value the name of the value needs to be "value":

@attribute class fooBar
{
    string value;
}

This allows to not have to specify the key when passing a value to the attribute:

@fooBar("asd") class Foo {}

Accessing information about attribute should be possible both during compile time and runtime. At compile time "__traits" can be used:

__traits(hasAttribute, bar, Foo); // returns true if the attribute "bar" as been applied to "Foo"

__traits(getAttribute, bar, key, Foo); // returns the value of the key "key"

This is all very similar to how it works in Java:

http://docs.oracle.com/javase/1.5.0/docs/guide/language/annotations.html

--
/Jacob Carlborg

Reply via email to