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