need help with CTFE

Dmitri Makarov via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Mar 26 09:19:16 PDT 2015


I'm compiling the following application (2 d modules)

// file c/tool.d
module c.tool;

struct Tool
{
   string name;

   auto generate()
   {
     version (DOES_NOT_WORK)
     {
       import std.traits : hasMember;
       if (hasMember!(Tool, name))
         return `writeln("this is a ` ~ mixin ("this." ~ name ~ 
"()") ~ `.");`;
     }
     else
     {
       if (name == "hammer")
         return `writeln("this is a ` ~ this.hammer() ~ `.");`;
     }
     return `writeln("unknown tool ` ~ name ~ `.");`;
   }

   auto hammer()
   {
     return "screwdriver";
   }
}

string code(string input)
{
   auto tool = Tool(input);
   return tool.generate();
}
-----------------
// file x/app.d
class Application
{
   void run()
   {
     import c.tool;
     import std.stdio;
     mixin (code("hammer"));
     mixin (code("transmogrifier"));
   }
}

int main(string[] args)
{
   auto app = new Application();
   app.run();
   return 0;
}

When I compile version DOES_NOT_WORK, I get the following error:
c/tool.d(13): Error: variable name cannot be read at compile time
c/tool.d(13):        while looking for match for hasMember!(Tool, 
name)

However, the other version ('else' case) compiles, runs, and 
outputs (as expected):
this is a screwdriver.
unknown tool transmogrifier.

What's the fundamental difference that makes the variable 'name' 
readable in one version and unreadable in another?  Should the 
version DOES_NOT_WORK not be compilable in principle or is it 
only a limitation of the current CTFE implementation in the 
front-end?

Thanks.


More information about the Digitalmars-d-learn mailing list