On Sunday, 2 September 2012 at 16:59:19 UTC, Maxim Fomin wrote:

This reminds me custom attributes discussion which can be found in NG archive. Requested language additions relevant to attributes may be divided
into three groups:

1 (tags). We want to tag some (likely function) declarations like @nogc.

IMO, this is a poor choice.

2 (extending type). We want to define type (likely classes) and then
extend its functionality.
AFAIK C# attributes belong to this camp (correct me if I am wrong). In
this case (likely class) type implicitly derives
from attribute class. Obviously this also related to compile time
because D being static typed language and has no
way to be aware at run time that type functionality was extended. I
think that it is not worth embedding in the language, because
it is already possible to derive from base class, or interface, or
instantiated template or to use mixin.

This is my preferred solution. This is also similar to Java. In fact there are only small differences between C# and Java semantics. This also includes other languages on the matching platforms, E.g. Nemerle is a .net language and provides the same attributes mechanism as C#. I assume that Scala does the same with Java annotations.

The C# way (which I slightly prefer over the Java one):
class Whatever : Annotation { // user defined annotation type
}

Java uses @interface to define a user defined annotation.
@interface whatever { // user defined annotation type
}

I don't get your last point at all regarding inheritance - in both Java and C# it should be possible to use polymorphism with annotations. No need to add a new mechanism for it.
class Foo : whatever {} // inheritance

Really, the main things that are needed inside the compiler are a mechanism to attach custom attributes to various lingual parts, a way to mark such custom attributes by e.g. deriving from a special class (not unlike the IUnknown interface in D for COM) and standard compiler APIs for usage inside such an attribute. One extra step is defining an execution model for custom attributes: Java way is multi-pass - compiler executes the annotations which generate new version of the code, which is run through the compiler again, and so forth. Nemerle way - attributes can be macros which in turn can manipulate the AST.
etc..


3 (extending instance). We want to make some instance of (extremely likely class) type to extend functionality
while still remaining in original type without affecting type.

I don't get this at all. What's the purpose of having a single type?


I offer simple solutions because I estimate probability of introducing
complex addition to the language now as
extremely low.


Reply via email to