How give a module to a CTFE function

Xavier Bigand flamaros.xavier at gmail.com
Mon Mar 12 22:28:30 UTC 2018


Le 12/03/2018 à 23:24, Xavier Bigand a écrit :
> 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.
>

I forgot to precise, that I don't have a main, because I am trying to 
create an opengl32.dll. This is why I already have a mixin to inject to 
function definitions in the root scope.



More information about the Digitalmars-d-learn mailing list