How give a module to a CTFE function

Xavier Bigand flamaros.xavier at gmail.com
Mon Mar 12 22:24:15 UTC 2018


Le 12/03/2018 à 22:30, arturg a écrit :
> On Monday, 12 March 2018 at 21:00:07 UTC, Xavier Bigand wrote:
>> Hi,
>>
>> I have a CTFE function that I want to make more generic by given it a
>> module as parameter.
>>
>>
>> My actual code looks like :
>>
>> mixin(implementFunctionsOf());
>>
>>
>> string implementFunctionsOf()
>> {
>>     import std.traits;
>>
>>     string    res;
>>
>>     foreach(name; __traits(allMembers, myHardCodedModule))
>>     {
>>     }
>>     return res;
>> }
>>
>>
>> I tried many things but I can't figure out the type of the parameter I
>> should use for the function implementFunctionsOf.
>
> you can use a alias or a string:
>
> void fun(alias mod, string mod2)()
> {
>     foreach(m; __traits(allMembers, mod))
>         pragma(msg, m);
>
>     foreach(m; __traits(allMembers, mixin(mod2)))
>         pragma(msg, m);
> }
>
> void main()
> {
>     import std.stdio;
>     fun!(std.stdio, "std.stdio");
> }


I tried both without success,


Here is my full code :

module api_entry;

import std.stdio : writeln;
import std.algorithm.searching;

import derelict.opengl3.functions;

import std.traits;

string implementFunctionsOf(string mod)
{
     import std.traits;

     string	res;

     static foreach(name; __traits(allMembers, mixin(mod)))
     {
         static if (mixin("isCallable!" ~ name)
                    && name.startsWith("da_"))
         {
             string oglFunctionName = name[3..$];
             string returnType = ReturnType!(mixin(name)).stringof;
             string parametersType = Parameters!(mixin(name)).stringof;

             res ~=
                 "export\n" ~
                 "extern (C)\n" ~
                 returnType ~ "\n" ~
                 oglFunctionName ~
                 parametersType ~ "\n" ~
                 "{\n" ~
                 "   writeln(\"" ~ oglFunctionName ~ "\");\n";

             static if (ReturnType!(mixin(name)).stringof != "void")
             {
                 res ~=
                     "   " ~ returnType ~ " result;\n" ~
                     "   return result;";
             }
             res ~=
                 "}\n";
         }
     }
     return res;
}

mixin(implementFunctionsOf("derelict.opengl3.functions"));


As string I get the following error:
..\src\api_entry.d(16): Error: variable `mod` cannot be read at compile time
..\src\api_entry.d(48):        called from here: 
`implementFunctionsOf("derelict.opengl3.functions")`




I also tried to make implementFunctionsOf a mixin template.



More information about the Digitalmars-d-learn mailing list