Counter-Proposal: restrict & tagged functions
Maxim Fomin
maxim at maxim-fomin.ru
Mon Sep 3 09:21:31 PDT 2012
On Monday, 3 September 2012 at 00:01:09 UTC, foobar wrote:
>> 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..
>
The question with this approach is follows: if attributes are
just another way of deriving why not use old syntax?
>>
>> 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?
>
It is not a single type, it is extending functionality of
instance at run time which can be simulated by containers.
More information about the Digitalmars-d
mailing list