On Tuesday, 18 December 2018 at 14:23:38 UTC, berni wrote:
On Tuesday, 18 December 2018 at 13:53:01 UTC, Stefan Koch wrote:
Why would you need to know?

Well, first out of curiosity. But there are also other reasons: I've got a large immutable array. Without CTFE I'd use some php script and add it as a large literal. With CTFE I don't need that php script nor do I need to put that large literal in the source code. But I need to know, that indeed the array is calculated by the compiler, else the solution with the php script would result in faster code.


How is the items in the array generated? if the function can be called as following:

enum myArr = generateArray();

then you know for sure you have a satic array of strings at compile time. I've used something similar, to generate a JSON string from all UDAs in a give class, which I needed to pass to a C# application (I made the D output a string from the request by command line option). I did something like this:

string getAvailableForms()
{
        import extensions.enumeration : staticMembers;
        import asdf; // JSON serializer
        import std.traits : getUDAs, hasUDA;
        import externalPaths : ExternalAppPath, DisplayName;
        import std.algorithm : startsWith;
        import std.conv : to;

        FormDisplayNameObj[] output;
        static foreach(string fieldName; staticMembers!ExternalAppPath)
        {{
static if(hasUDA!(__traits(getMember, ExternalAppPath, fieldName), DisplayName))
                {
                        if(fieldName.startsWith(startKey))
                        {
DisplayName dn = getUDAs!(__traits(getMember, ExternalAppPath, fieldName), DisplayName)[0]; string id = extractDigits(fieldName[startKey.length - 1 .. $]);
                                int i  = to!int(id);
                                auto o = new FormDisplayNameObj();
                                o.value = dn.value;
                                o.index = i;
                                output ~= o;
                        }
                }
        }}
        return output.serializeToJson;
}

then:

enum s = getAvailableForms;
writeln(s);

I did consider at first make a script to generate that string but I managed to make it work with CTFE that way.

Reply via email to