Custom attributes (again)

Manu turkeyman at gmail.com
Fri Apr 6 06:08:00 PDT 2012


On 6 April 2012 15:13, deadalnix <deadalnix at gmail.com> wrote:

> Le 06/04/2012 11:41, Johannes Pfau a écrit :
>
>  Am Fri, 06 Apr 2012 00:48:34 -0700
>> schrieb Walter Bright<newshound2 at digitalmars.**com<newshound2 at digitalmars.com>
>> >:
>>
>>  On 4/6/2012 12:35 AM, Alex Rønne Petersen wrote:
>>>
>>>> It actually can be a problem. In .NET land, there are many
>>>> attributes across many projects (and even in the framework itself)
>>>> with the same names. It turns out that regular namespace lookup
>>>> rules alleviate this problem.
>>>>
>>>
>>>
>>> Perhaps a better scheme is:
>>>
>>>     enum foo = 3;
>>>
>>>     ...
>>>
>>>     @attr(foo) int x;
>>>
>>> That way, foo will follow all the usual rules.
>>>
>>>
>> The last time custom attributes where discussed, a C# like model was
>> proposed. Is there a good reason why we should deviate from the C#
>> implementation?
>>
>> C#:
>> http://msdn.microsoft.com/en-**US/library/48zeb25s(v=vs.80).**aspx<http://msdn.microsoft.com/en-US/library/48zeb25s(v=vs.80).aspx>
>> http://msdn.microsoft.com/en-**US/library/sw480ze8(v=vs.100).**aspx<http://msdn.microsoft.com/en-US/library/sw480ze8(v=vs.100).aspx>
>> http://msdn.microsoft.com/en-**US/library/z919e8tw(v=vs.80).**aspx<http://msdn.microsoft.com/en-US/library/z919e8tw(v=vs.80).aspx>
>>
>> (C# attributes can be applied to almost everything, therefore sometimes
>>  "disambiguating targets" is necessary. Probably not needed in D):
>> http://msdn.microsoft.com/en-**US/library/b3787ac0(v=vs.80).**aspx<http://msdn.microsoft.com/en-US/library/b3787ac0(v=vs.80).aspx>
>>
>> Syntax in D would be different of course, but I see absolutely no need
>> for the redundant (and ugly) @attr.
>>
>> Declaring a custom attribute:
>> ---------
>> module std.something;
>>
>> struct Author
>> {
>>     string name;
>>     public this(string name)
>>     {
>>         this.name = name;
>>     }
>> }
>> ---------
>>
>> Using it:
>> ---------
>> import std.something; //Usual namespace lookup rules apply to attributes
>>
>> /*
>>  * @Author(param) calls the constructor of the Author struct and
>>  * attaches the struct instance to test. Probably @Author (without
>>  * parenthesis) coud be made to mean std.something.Author.init
>>  */
>> @Author("Johannes Pfau") int test;
>> ---------
>>
>> Attaching attributes multiple times as in C# should be possible.
>>
>> Using reflection to get that attribute:
>> ---------
>> if(__traits(hasAttribute, test, std.something.Author))
>> {
>>     Author[] authors = __traits(getAttribute, test,
>>         std.something.Author);
>> }
>> ---------
>>
>> An array is used here to support attaching the same attribute multiple
>> times. Of course "auto authors = ..." should be usable here too.
>>
>>
> That is a really nice proposal !
>

This is precisely how I have always imagined the system working. Walter:
can you comment why you think this is not do-able, or not a good way to go
about it?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20120406/f81954ae/attachment.html>


More information about the Digitalmars-d mailing list