www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Runtime evaluation

reply nrgyzer <nrgyzer gmail.com> writes:
Hi guys,

I'm trying to read a string from a text file which contains a value of an
enumeration like:

enum MyEnum : string {
   Entry_1 = "abc",
   Entry_2 = "def",
   Entry_3 = "ghi",
}

Stream s = new File("myFile.ext", FileMode.In);
uint len;
s.read(len);
string entry = cast(string) s.readString(len);
s.close();

writeln(mixin("MyEnum." ~ entry));

myFile.ext may contain:
...
Entry_2
Entry_1
Entry_2
Entry_3
...

But mixin's are for compile time only... is there any chance to do this or do
I've to use another method (like if/else or switch/case):

if (entry == "Entry_1") ...
else if (entry == "Entry_2") ...
...

Thanks a lot!
Jul 07 2011
next sibling parent David Nadlinger <see klickverbot.at> writes:
You could generate the if/else-chain, lookup table, etc. via 
metaprogramming to save you the typing and code duplication (probably a 
foreach over std.traits.EnumMembers will be involved).

David


On 7/7/11 11:23 PM, nrgyzer wrote:
 Hi guys,

 I'm trying to read a string from a text file which contains a value of an
enumeration like:

 enum MyEnum : string {
     Entry_1 = "abc",
     Entry_2 = "def",
     Entry_3 = "ghi",
 }

 Stream s = new File("myFile.ext", FileMode.In);
 uint len;
 s.read(len);
 string entry = cast(string) s.readString(len);
 s.close();

 writeln(mixin("MyEnum." ~ entry));

 myFile.ext may contain:
 ...
 Entry_2
 Entry_1
 Entry_2
 Entry_3
 ...

 But mixin's are for compile time only... is there any chance to do this or do
I've to use another method (like if/else or switch/case):

 if (entry == "Entry_1") ...
 else if (entry == "Entry_2") ...
 ...

 Thanks a lot!
Jul 07 2011
prev sibling parent reply Mafi <mafi example.org> writes:
Am 07.07.2011 23:23, schrieb nrgyzer:
 Hi guys,

 I'm trying to read a string from a text file which contains a value of an
enumeration like:

 enum MyEnum : string {
     Entry_1 = "abc",
     Entry_2 = "def",
     Entry_3 = "ghi",
 }

 Stream s = new File("myFile.ext", FileMode.In);
 uint len;
 s.read(len);
 string entry = cast(string) s.readString(len);
 s.close();

 writeln(mixin("MyEnum." ~ entry));

 myFile.ext may contain:
 ...
 Entry_2
 Entry_1
 Entry_2
 Entry_3
 ...

 But mixin's are for compile time only... is there any chance to do this or do
I've to use another method (like if/else or switch/case):

 if (entry == "Entry_1") ...
 else if (entry == "Entry_2") ...
 ...

 Thanks a lot!
Metaprogramming is the keyword but you don't have to do it yourself. Just use std.conv.to!MyEnum(string_without_the prefix). Mafi
Jul 08 2011
parent nrgyzer <nrgyzer gmail.com> writes:
== Auszug aus Mafi (mafi example.org)'s Artikel
 Am 07.07.2011 23:23, schrieb nrgyzer:
 Hi guys,

 I'm trying to read a string from a text file which contains a
value of an enumeration like:
 enum MyEnum : string {
     Entry_1 = "abc",
     Entry_2 = "def",
     Entry_3 = "ghi",
 }

 Stream s = new File("myFile.ext", FileMode.In);
 uint len;
 s.read(len);
 string entry = cast(string) s.readString(len);
 s.close();

 writeln(mixin("MyEnum." ~ entry));

 myFile.ext may contain:
 ...
 Entry_2
 Entry_1
 Entry_2
 Entry_3
 ...

 But mixin's are for compile time only... is there any chance to
do this or do I've to use another method (like if/else or switch/ case):
 if (entry == "Entry_1") ...
 else if (entry == "Entry_2") ...
 ...

 Thanks a lot!
Metaprogramming is the keyword but you don't have to do it yourself. Just use std.conv.to!MyEnum(string_without_the prefix). Mafi
Thanks Mafi, exactly what I'm looking for :)
Jul 09 2011