reflective enums

Kevin Bealer kevinbealer at gmail.com
Mon Feb 19 02:25:45 PST 2007


renoX wrote:
> Kevin Bealer Wrote:
> 
>> renoX wrote:
>>> Kevin Bealer a écrit :
>>>> == Quote from renoX (renosky at free.fr)'s article
>>>>> - why the name getString instead of the usual toString name?
>>>> That could be changed too; I think of toString() as an object method, and
>>>> when adding a static method, I figured I should use a different name to
>>>> avoid conflicting with the method.  I didn't really check whether there
>>>> is a real conflict on this.
>>>  From my testing, it doesn't trigger a conflict, but I've only tested it 
>>> inside one file.
>>>
>>>> There is kind of a strangeness with the way I defined this in that you
>>>> creating instances of the Enum!(...) struct is not useful.  The type is
>>>> only really interesting for its static properties.
>>> About this I was wondering if it wouldn't be less strange to do a 
>>> template like this:
>>>
>>> // expected usage: DefEnum!("enum ListEnumFoo {A,B=1};")
>>> template DefEnum(char[] def_enum) {
>>>
>>>     mixin(def_enum);
>>>
>>>     static toString(EnumType!(def_enum) x)
>>>     {
>>>         // function body similar to the inital get_String()
>>>     }
>>> }
>>>
>>> Advantages:
>>> -The reflective enum type is really an enum type, so it acts like one.
>>> -No weird struct.
>>> -When(If) I can convince Walther that writef("foo %s",x) means really 
>>> writef("foo "~x.toString()); we could write:
>>> writef("enum x value is %d and name is %s\n",x,x); and have the correct 
>>> result, because toString(ListEnumFoo x) would hide toString(int x) {x 
>>> being an enum variable from type ListEnumFoo).
>>>
>>> Disadvantage:
>>> No easy way to iterate among the enum values: we cannot do
>>> foreach(v; ListEnumFoo) because now ListEnumFoo is an enum not a struct..
>>> And we cannot pass an enum type as a parameter, other it would be easy 
>>> to define function 'keys' and 'values' (like for associative arrays), so 
>>> we'd need a dummy parameter, i.e you wouldn't be able to write
>>> foreach (v; ListEnumFoo) {} and
>>> neither foreach (v; ListEnumFoo.values()) {}
>>> but foreach (v; ListEnumFoo.A.values()) {} could perhaps work.
>>>
>>> What do you think about this other way to do it?
>>>
>>> Regards,
>>> renoX
>> I don't like the extra syntax -- in your example, the word 'enum' 
>> appears three times. 
> 
> This is easy to fix..
> 
>> I also like the ability to foreach() over an enum. 
>> But this has made me think of another idea that adds some of the 
>> "enum"-ness back to the struct.  I'll post it if I can make it work. 
>> Kevin
> 
> How about we discuss our usecase first, then we could work on the API for declaration, use, print and foreach.
> Given our initial work as a basis, the implementation then should be easy either using templates or compile-time functions (I've seen your implementation and I must admit that I'm a bit disappointed that it doesn't look that much better than the one which used templates).
> 
> I'll open a new thread so that the discussion about the design is seen by everyone, hopefully some will contribute.
> renoX
> 

Okay.  A lot of the awkwardness in the code for the second one is due to 
limitations in the current CTFE.  Things like char[][], functions like 
split(), format(), replace(), and so on from std.strings, would have 
made the code much simpler.  I think in all these cases it is a matter 
of time.  It's quite amazing that the CTFE stuff was added to DMD as 
quickly as it was but it has a few limits yet and its amazing how much 
of the language and library even a simple case like this uses.

Kevin




More information about the Digitalmars-d mailing list