Counter-Proposal: restrict & tagged functions
foobar
foo at bar.com
Sun Sep 2 17:01:37 PDT 2012
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.
More information about the Digitalmars-d
mailing list