digitalmars.D - Custom attributes C#
- Sclytrack (28/28) Sep 26 2007 Could D have custom attributes like in C# ?
- DavidL (7/47) Sep 26 2007 I've proposed something about naming a scope.
- Janice Caron (3/4) Sep 26 2007 Please could you explain this for the benefit of those of us who do
- Daniel Keep (16/21) Sep 27 2007 class Foo
- Janice Caron (6/6) Sep 27 2007 This is obviously some strange usage of the word "explain" that I
- Regan Heath (4/11) Sep 27 2007 I'm guessing:
- Bruno Medeiros (7/14) Sep 27 2007 It's a concept similar to Java's annotations, aren't you familiar with
- Janice Caron (6/8) Sep 27 2007 Nope. I have always found C and C++ (and now D) to be perfectly
- Daniel Keep (20/31) Sep 27 2007 Look, ignore the syntax; it's not important. Pretend I used @s or $s or
- David Wilson (13/29) Sep 27 2007 Modules, fields, properties, methods, structs, classes, parameters and
- Jari-Matti =?ISO-8859-1?Q?M=E4kel=E4?= (7/13) Sep 27 2007 Makes me think that maybe e.g. 'unittest', 'deprecated' and pragma shoul...
- Jari-Matti =?ISO-8859-1?Q?M=E4kel=E4?= (3/18) Sep 27 2007 I guess this is yet another good example of the principle that the simpl...
- Bruno Medeiros (21/36) Sep 27 2007 Indeed. It seems to follow a general pattern that software meant to be
- =?ISO-8859-1?Q?Julio_C=E9sar_Carrascal_Urquijo?= (10/16) Sep 27 2007 That's exactly how it's done in .NET:
- Janice Caron (41/41) Sep 28 2007 Thank you Daniel, for that wonderful explanation. I've got it now. It
- Janice Caron (2/3) Sep 28 2007 Yikes! Apologies. Read that as Bruno.
- janderson (6/44) Sep 29 2007 I agree, whatever the solution is (even if its just in the standard
- Ary Manzana (21/28) Sep 27 2007 They allow you to add information about classes, methods, etc, directly
- Michel Fortin (28/29) Sep 27 2007 I'm all for it.
public class MyCustomAttribute:Attribute { public MyCustomAttribute( string text) { } ... } class MyClass { [MyCustom("my text")] void DoStuff() { } } The attributes can then be retrieved by system reflection. An attribute is a class thus can contain code. I was thinking of something similar in D, but simpler attribute published; // published would then be an attribute. class Window { attr(published) void caption(char [] text) { } } __traits( allAttributes, ) and maybe dropping the two underscores in the __traits #d.lounge Arthur, give Zuu a cookie.
Sep 26 2007
Sclytrack Wrote:public class MyCustomAttribute:Attribute { public MyCustomAttribute( string text) { } ... } class MyClass { [MyCustom("my text")] void DoStuff() { } } The attributes can then be retrieved by system reflection. An attribute is a class thus can contain code. I was thinking of something similar in D, but simpler attribute published; // published would then be an attribute. class Window { attr(published) void caption(char [] text) { } } __traits( allAttributes, ) and maybe dropping the two underscores in the __traits #d.lounge Arthur, give Zuu a cookie.I've proposed something about naming a scope. scope("myattribute")void caption(char [] text){} there must be some more general thing. Maybe alias is a better naming alias("myattribute") void caption(char[] text){} alias("myvar") int var;
Sep 26 2007
On 9/26/07, Sclytrack <sclytrack pi.be> wrote:Please could you explain this for the benefit of those of us who do
Sep 26 2007
Janice Caron wrote:On 9/26/07, Sclytrack <sclytrack pi.be> wrote:class Foo { [SerialiseAs("bar")] int _bar; [DontSerialiseAtAll] void* _someCachedThing; } class ControllerWidget { [GuiLabel("First Name"),GuiControl("TextBox")] string firstName; [GuiLabel("Last Name"),GuiControl("TextBox")] string lastName; [GuiLabel("Update records"),GuiControl("Button")] void update() { ... } } -- DanielPlease could you explain this for the benefit of those of us who do
Sep 27 2007
This is obviously some strange usage of the word "explain" that I wasn't previously aware of :-( Any chance anyone could explain what that means? Square brackets mean array access to me, so just sticking function calls in square brackets where it would be a syntax error to do so does not really constitute an explanation in my book.
Sep 27 2007
Janice Caron wrote:This is obviously some strange usage of the word "explain" that I wasn't previously aware of :-( Any chance anyone could explain what that means? Square brackets mean array access to me, so just sticking function calls in square brackets where it would be a syntax error to do so does not really constitute an explanation in my book.I'm guessing: http://en.wikipedia.org/wiki/.NET_metadata Regan
Sep 27 2007
Janice Caron wrote:This is obviously some strange usage of the word "explain" that I wasn't previously aware of :-( Any chance anyone could explain what that means? Square brackets mean array access to me, so just sticking function calls in square brackets where it would be a syntax error to do so does not really constitute an explanation in my book.It's a concept similar to Java's annotations, aren't you familiar with those either? (http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html) -- Bruno Medeiros - MSc in CS/E student http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D
Sep 27 2007
On 9/27/07, Bruno Medeiros <brunodomedeiros+spam com.gmail> wrote:It's a concept similar to Java's annotations, aren't you familiar with those either?Nope. I have always found C and C++ (and now D) to be perfectly adequate for every need I've ever had. So tell me, what are these things _for_? What's the _point_ of them? What do they do, and why would adding them to D be a good idea. What will it enable me to do that I can't already do in C, C++ or D?
Sep 27 2007
Janice Caron wrote:On 9/27/07, Bruno Medeiros <brunodomedeiros+spam com.gmail> wrote:Look, ignore the syntax; it's not important. Pretend I used s or $s or whatever makes you comfortable. The point is, it's a system for annotating declarations. Like how you scribble in the margins of a book next to a particularly inane paragraph: "this guy is nuts!" You know... *metadata*. And I would have thought the examples I gave before were a pretty good example of why they're useful. Look at the first class; I've used them to annote fields with information on how they should be serialised. In the second one I've used them to indicate how an object might be bound to a UI. Ary has an even better example: specifying how to bind an object to a database table. That's like what ActiveRecord (the real magic behind Ruby on Rails) does. It'd practically give us half of D on Rails. :P The point is to give programmers a way of adding extra information about a declaration that you wouldn't normally be able to convey. Granted, you *could* do this in D right now; in much the same way you can do OO programming in assembler. You could probably fake it with variadic templates and structs, etc., but it'd be ugly as heck. -- DanielIt's a concept similar to Java's annotations, aren't you familiar with those either?Nope. I have always found C and C++ (and now D) to be perfectly adequate for every need I've ever had. So tell me, what are these things _for_? What's the _point_ of them? What do they do, and why would adding them to D be a good idea. What will it enable me to do that I can't already do in C, C++ or D?
Sep 27 2007
On 27/09/2007, Daniel Keep <daniel.keep.lists gmail.com> wrote:The point is, it's a system for annotating declarations.Modules, fields, properties, methods, structs, classes, parameters and return types to be precise (IIRC).And I would have thought the examples I gave before were a pretty good example of why they're useful.Source code can only ever show the *how* ;). .NET attributes are a fairly awesome concept, but I'm not sure if they fit in with the simplicity of D. Another thing is, .NET has a rather powerful and well designed API for doing introspection, whereas D's capabilities are quite simplistic. I think it's a nice idea, and indeed I was looking for something similar in D not a week ago. ;) But I wouldn't miss the complexity if it were never added. Attributes are a luxurious way of doing things rather than a necessity. David.Look at the first class; I've used them to annote fields with information on how they should be serialised. In the second one I've used them to indicate how an object might be bound to a UI. Ary has an even better example: specifying how to bind an object to a database table. That's like what ActiveRecord (the real magic behind Ruby on Rails) does. It'd practically give us half of D on Rails. :P The point is to give programmers a way of adding extra information about a declaration that you wouldn't normally be able to convey. Granted, you *could* do this in D right now; in much the same way you can do OO programming in assembler. You could probably fake it with variadic templates and structs, etc., but it'd be ugly as heck. -- Daniel
Sep 27 2007
Daniel Keep wrote:The point is to give programmers a way of adding extra information about a declaration that you wouldn't normally be able to convey. Granted, you *could* do this in D right now; in much the same way you can do OO programming in assembler. You could probably fake it with variadic templates and structs, etc., but it'd be ugly as heck.Makes me think that maybe e.g. 'unittest', 'deprecated' and pragma should have been annotations instead of keywords. Annotations feel a much more extensible facility than a fixed set of keywords. I'm not really sure what tools) could really have a use for annotations in general. The language should not dictate what 3rd party tools can and cannot do.
Sep 27 2007
Jari-Matti Mäkelä wrote:Daniel Keep wrote:I guess this is yet another good example of the principle that the simpler the core language, the more it actually allows one to do.The point is to give programmers a way of adding extra information about a declaration that you wouldn't normally be able to convey. Granted, you *could* do this in D right now; in much the same way you can do OO programming in assembler. You could probably fake it with variadic templates and structs, etc., but it'd be ugly as heck.Makes me think that maybe e.g. 'unittest', 'deprecated' and pragma should have been annotations instead of keywords. Annotations feel a much more extensible facility than a fixed set of keywords. I'm not really sure what tools) could really have a use for annotations in general. The language should not dictate what 3rd party tools can and cannot do.
Sep 27 2007
Jari-Matti Mäkelä wrote:Daniel Keep wrote:Indeed. It seems to follow a general pattern that software meant to be used by a large population may benefit a lot from extensibility (even if the core purpose of the program does not require extensibility). We have examples in desktop applications such as Mozilla, Firefox, Winamp; in development tools such as Eclipse; and in games this principle also seems to apply (the ability to mod a game greatly increases its value, there are even games born out of mods, such as Counter-Strike) After Java annotations came out, third party tools quickly adopted it to various uses, one of them being to define Object-Relational DB mappings, OR mapping (like I have in the past, with Apache OJB), you know how inane and annoying that is. I've recently taken a look at OR mapping using Java annotations and it's way, *way* better. Safer, less brittle, less verbose and more readable. This kinda of stuff can open whole new segments in the target population of a language. But in any case, we'd need runtime reflection first, to have something like this. Compile-time annotations only would be of limited use (I think). -- Bruno Medeiros - MSc in CS/E student http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#DThe point is to give programmers a way of adding extra information about a declaration that you wouldn't normally be able to convey. Granted, you *could* do this in D right now; in much the same way you can do OO programming in assembler. You could probably fake it with variadic templates and structs, etc., but it'd be ugly as heck.Makes me think that maybe e.g. 'unittest', 'deprecated' and pragma should have been annotations instead of keywords. Annotations feel a much more extensible facility than a fixed set of keywords. I'm not really sure what tools) could really have a use for annotations in general. The language should not dictate what 3rd party tools can and cannot do.
Sep 27 2007
Jari-Matti Mäkelä wrote:Makes me think that maybe e.g. 'unittest', 'deprecated' and pragma should have been annotations instead of keywords. Annotations feel a much more extensible facility than a fixed set of keywords. I'm not really sure whatThat's exactly how it's done in .NET: ObsoleteAttribute: http://msdn2.microsoft.com/en-us/library/system.obsoleteattribute.aspx TestFixtureAttribute and TestAttribute in NUnit: http://nunit.org/index.php?p=attributes&r=2.4.3tools) could really have a use for annotations in general. The language should not dictate what 3rd party tools can and cannot do.They're pretty much the same thing. -- Julio César Carrascal Urquijo http://jcesar.totumo.net/
Sep 27 2007
Thank you Daniel, for that wonderful explanation. I've got it now. It all makes sense. Seems to me that this is a good idea, because, like templates, it allows things to be done in libraries and user code which would otherwise have to be done in the language. It makes the langage /simpler/, not more complicated, but at the same time it lets you express more. That's gotta be a win-win all round. It would mean that we could deprecate "deprecated" (ironically), and replace it with an annotation. Ditto pragmas. xxxxx said it wouldn't be much use without runtime reflection. I disagree. Compile-time annotations would still be useful. As noted above, compile-time annotations would allow us to get rid of "deprecated" (and also "unittest" and "pragma"). How can getting rid of keywords not be a good thing? It would also allow for some pretty cunning templates, assuming that templates could specialise on the presence (or absence) of an annotation. Runtime reflection can come later (if that's that way D goes). However, I would like to say this, before the ink dries on the paper - that (in my opinion) there are things much worse than keyword bloat, and among those worse things I would include operator bloat and punctuation bloat. (Operator bloat is just a special case of punctuation bloat). You can argue that too many keywords pollutes the namespace, but to give too many different meanings to too many combinations of punctuation marks is way, way worse. I don't want to see *%!? and the like in source code, and have to learn what it means. Walter got it absolutely right when he introduced the cast() syntax - it's /totally/ readable. So, here, I believe, is a circumstance where a keyword is desirable, and preferable to any combination of punctuation marks. Compare: big fat int f(int n); // Java style metadata(big,fat) int f(int n); // One possible alternative keywords(big,fat) int f(int n); // Another possible alternative pragma(big,fat) int f(int n); // A third alternative My third suggestion re-uses the already reserved word "pragma", so no new reserved words would have to be introduced, so even keyword bloat is avoided.
Sep 28 2007
On 9/28/07, Janice Caron <caron800 googlemail.com> wrote:xxxxx said it wouldn't be much use without runtime reflection.Yikes! Apologies. Read that as Bruno.
Sep 28 2007
Daniel Keep wrote:Janice Caron wrote:I agree, whatever the solution is (even if its just in the standard library) it needs to be standard otherwise it defeats the purpose of being able to simply import 3rd-party libraries that will work with your markup. -JoelOn 9/27/07, Bruno Medeiros <brunodomedeiros+spam com.gmail> wrote:Look, ignore the syntax; it's not important. Pretend I used s or $s or whatever makes you comfortable. The point is, it's a system for annotating declarations. Like how you scribble in the margins of a book next to a particularly inane paragraph: "this guy is nuts!" You know... *metadata*. And I would have thought the examples I gave before were a pretty good example of why they're useful. Look at the first class; I've used them to annote fields with information on how they should be serialised. In the second one I've used them to indicate how an object might be bound to a UI. Ary has an even better example: specifying how to bind an object to a database table. That's like what ActiveRecord (the real magic behind Ruby on Rails) does. It'd practically give us half of D on Rails. :P The point is to give programmers a way of adding extra information about a declaration that you wouldn't normally be able to convey. Granted, you *could* do this in D right now; in much the same way you can do OO programming in assembler. You could probably fake it with variadic templates and structs, etc., but it'd be ugly as heck. -- DanielIt's a concept similar to Java's annotations, aren't you familiar with those either?Nope. I have always found C and C++ (and now D) to be perfectly adequate for every need I've ever had. So tell me, what are these things _for_? What's the _point_ of them? What do they do, and why would adding them to D be a good idea. What will it enable me to do that I can't already do in C, C++ or D?
Sep 29 2007
They allow you to add information about classes, methods, etc, directly in their source code. Then you can access that information either at compile time or runtime. So for example you can have a class that represents an object that maps to a database: [Table("Person")] class Person { [PrimaryKey("Id")] int id; [Field("Name")] char[] name; } Then you can have a class that knows how to save objects into a database by just querying those attributes. This is very comfortable since you have the specification of how to map a class to a database right in the class' definition, instead of in another file. I guess they are a generalization of attributes like "public", "static", "const", etc (you could have [Public], but it's more verbose). An example of a compile-time attribute is [SuppressWarning(id)] (in Java, at least), that instructs the compiler to not generate some warnings for a certain class, method, etc. Janice Caron wrote:This is obviously some strange usage of the word "explain" that I wasn't previously aware of :-( Any chance anyone could explain what that means? Square brackets mean array access to me, so just sticking function calls in square brackets where it would be a syntax error to do so does not really constitute an explanation in my book.
Sep 27 2007
On 2007-09-26 15:33:25 -0400, Sclytrack <sclytrack pi.be> said:I'm all for it. If done properly, this could allow me to simplify drastically the D/Objective-C bridge which is currently mimicking that with templates. It would make the syntax cleaner and could potentially make compilation much faster too. In the bridge, I'm currently mimicking this with a mixin, for instance: class MyClass { void value(int v) { ... } mixin ObjcBindMethod!(value, void, "setValue:"); } This currently works by adding to the class a member struct I can later access using tupleof (D version 1 here). That struct only has static members so that it does not take up any space in object instance. These static members include the method definition for the Objective-C runtime with a pointer to a generated forwarder function. Each method binding mixin has to repeat the function name, the return type and the type for all arguments, leaving only the Objective-C selector unrepeated. That's innefficient and somewhat error-prone. With proper reflective attributes, things could be much cleaner. Binding to Objective-C isn't much different from binding to a GUI, so surely this can benefit other senarios too. -- Michel Fortin michel.fortin michelf.com http://michelf.com/
Sep 27 2007