On 6 April 2012 09:47, Walter Bright <newshound2@digitalmars.com> wrote:
On 4/5/2012 5:00 AM, Manu wrote:
> C# and Java both have attributes, following these established design patterns, I
> don't think there should be any mystery over how they should be implemented.

I was thinking of something along the lines of what has been proposed here earlier:

 @attr(identifier = expression)

as a storage class, like:

 @attr(foo = bar + 1) int x;

and then:

 __traits(hasAttribute, x, foo)

would return true, and:

 __traits(getAttribute, x, foo)

would return the expression (bar+1). The expression would be compile-time only, evaluated at the point of declaration.

The implementation is simple enough, just attach to each symbol an array of (identifier,expression) pairs.

You could also omit the expression, and just have:

 @attr(bar) int y;

I think this is unnecessarily verbose, although certainly workable as a minimum. Although there is one issue that 'foo' can't store compound data.
I'd like to see attributes defined as a special sort of struct, and support constructors, this way you can associate rich data, and you can perform complex expressions (ctfe) within the constructor to set defaults, or calculate other details about the attribute if not specified.

@replay int x; // this is all that is needed if the attribute associates no variable information

// or something associating consideraly more rich information
@editor("X coordinate", EditType.Slider, Colour.Red, "Verbose description about the thing") // this is still a lot easier to read to me...
int x;