This is my first code in D, I feel like I'm already abusing mixin macros but I'm trying to avoid as much duplicate code/redundancies as possible. I would love a "static switch" as proposed in http://d.puremagic.com/issues/show_bug.cgi?id=6921 to replace the first AA, but since there isn't atm, a compile-time AA with a mixin is more elegant than seven "static if/else if" in single file.

enum TypeIndex : uint {
Nil = 0, // Undefined or dynamic value, depending on the context
    Number,
    String,
    Table,
    Classinst,
    Function,
Bool // Only used internally to avoid unnecessary bool->float conversions
}

// The rest below is for compile time only

private immutable string[TypeIndex] TyIdxtoDType = [
    TypeIndex.Nil : "DynamicValue",
    TypeIndex.Number : "Number",
    TypeIndex.String : "string",
    TypeIndex.Table : "TableHeader*",
    TypeIndex.Classinst : "ClassHeader*",
    TypeIndex.Function : "FunctionValue*",
    TypeIndex.Bool : "bool"
];

private template DType(TypeIndex tyIdx) {
    mixin("alias " ~ TyIdxtoDType(tyIdx) ~ " DType;");
}

But LDC gives me this error:
TalesRuntime.d(51): Error: expression '[cast(TypeIndex)0u:"DynamicValue", cast(TypeIndex)1u:"Number", cast(TypeIndex)2u:"string", cast(TypeIndex)3u:"TableHeader*", cast(TypeIndex)4u:"ClassHeader*", cast(TypeIndex)5u:"FunctionValue*", cast(TypeIndex)6u:"bool"]' is not a constant

And if I remove the immutable qualifier it says that the AA isn't available at compile time. Probably related: http://d.puremagic.com/issues/show_bug.cgi?id=6238 , but yebblies says that associative arrays work fine in CTFE, so I don't understand what I'm doing wrong. Is there a better way to create an AA mapping an enum to D type names?

Reply via email to