OK, now that 2.061 is out, we have User-Defined Attributes (UDAs).
Except, there is no doc on them, no explanation, nothing. For
people who did not follow the monstrous threads in November, it's
as if UDA do not exist.
Myself, I upgraded from 2.060 only yesterday, and I never used
them. Heck, I do not even know their syntax. This thread is for
people like me, who wonder what UDA are, and what can be done
with them.
Jacob Carlborg wrote documentation, but it's not merged into
dlang.org yet, AFAICT. Here it is:
https://github.com/jacob-carlborg/d-programming-language.org/commit/bddbdf18353203ba12d8e0e44391e8b6a031b91a
Here is the executive summary:
User Defined Attributes (UDA) are compile time expressions that
can be attached to a declaration. These attributes can then be
queried, extracted, and manipulated at compile time. There is no
runtime component to them.
Syntax:
@(3) int a;
@("string", 7) int b;
enum Foo;
@Foo int c;
struct Bar
{
int x;
}
@Bar(3) int d;
From that, I get we can put any CT symbol (even a value) as an
attribute. I thought we were restricted to user defined types.
To query them, use __traits(getAttributes, symbol)
@('c') string s;
__traits(getAttributes, s)
this gives a tuple of attributes, that can be manipulated as a
template tuple parameter (the 'raw' tuples).
Jacob, you doc says UDA are (grammatically) treated as storage
classes. Can we do:
class C {
@(3, "hello"):
int a;
double d;
}
And get both a and d with the same UDAs?
[Answer: silly me, I have 2.061. Yes, that works, both C.a and
C.d have (3, "hello") as an attribute]
My own rapid reading tells me we will rapidly need good tuple
manipulations templates in Phobos. We have mapping and filtering
(I guess?), but overloading, discarding, dropping and folding
will be needed also.