Thread overview
Mixin/static if issue
Aug 25, 2021
DLearner
Aug 25, 2021
H. S. Teoh
Aug 25, 2021
DLearner
Aug 25, 2021
jfondren
Aug 25, 2021
DLearner
August 25, 2021

Please see below:

void main() {
   import std.stdio;

   uint TestVar = 5;

   string mxnWrite_Size_t(string VarName) {

      static if (typeof(VarName).stringof == "uint") {

         return `write("` ~ VarName ~ `");`;
      } else {

         return `writeln("Apparently TestVar not a uint");`;	
	  }
   }

   mixin(mxnWrite_Size_t("TestVar"));
}

What I expected was the string "TestVar".
What I got was the "Apparently..." error message.
Please, why is this?

August 25, 2021
On Wed, Aug 25, 2021 at 10:16:39PM +0000, DLearner via Digitalmars-d-learn wrote:
> Please see below:
> ```
> void main() {
>    import std.stdio;
> 
>    uint TestVar = 5;
> 
>    string mxnWrite_Size_t(string VarName) {
                            ^^^^^^^^^^^^^^
Obviously, VarName is a string. Why would you expect anything else?


>       static if (typeof(VarName).stringof == "uint") {
[[...]

I think what you meant to write is:

       static if (typeof(mixin(VarName)).stringof == "uint") {

You want the type of the variable named by VarName, not the type of VarName.


T

-- 
Many open minds should be closed for repairs. -- K5 user
August 25, 2021

On Wednesday, 25 August 2021 at 22:33:00 UTC, H. S. Teoh wrote:
[...}

>

I think what you meant to write is:

   static if (typeof(mixin(VarName)).stringof == "uint") {

You want the type of the variable named by VarName, not the type of VarName.

T

I understand your reasoning, but:

void main() {
   import std.stdio;

   uint TestVar = 5;

   string mxnWrite_Size_t(string VarName) {

      static if (typeof(mixin(VarName)).stringof == "uint") {

         return `write("` ~ VarName ~ `");`;
      } else {

         return `writeln("Apparently TestVar not a uint");`;	
	  }
   }

   mixin(mxnWrite_Size_t("TestVar"));
}

produced Error: variable VarName cannot be read at compile time

August 25, 2021

On Wednesday, 25 August 2021 at 22:52:23 UTC, DLearner wrote:

>

On Wednesday, 25 August 2021 at 22:33:00 UTC, H. S. Teoh wrote:
[...}

>

I think what you meant to write is:

   static if (typeof(mixin(VarName)).stringof == "uint") {

You want the type of the variable named by VarName, not the type of VarName.

T

I understand your reasoning, but:

void main() {
   import std.stdio;

   uint TestVar = 5;

   string mxnWrite_Size_t(string VarName) {

      static if (typeof(mixin(VarName)).stringof == "uint") {

         return `write("` ~ VarName ~ `");`;
      } else {

         return `writeln("Apparently TestVar not a uint");`;	
	  }
   }

   mixin(mxnWrite_Size_t("TestVar"));
}

produced Error: variable VarName cannot be read at compile time

Contrast:

void main() {
   import std.stdio;

   uint TestVar = 5;

   string mxnWrite_Size_t(string VarName)() {

      static if (typeof(mixin(VarName)).stringof == "uint") {

         return `write("` ~ VarName ~ `");`;
      } else {

         return `writeln("Apparently TestVar not a uint");`;	
	  }
   }

   mixin(mxnWrite_Size_t!"TestVar");
}

Output: TestVar

August 25, 2021

On Wednesday, 25 August 2021 at 22:57:23 UTC, jfondren wrote:

>

Contrast:

[...]

>
void main() {
   import std.stdio;

   uint TestVar = 5;

   string mxnWrite_Size_t(string VarName)() {

      static if (typeof(mixin(VarName)).stringof == "uint") {

         return `write("` ~ VarName ~ `");`;
      } else {

         return `writeln("Apparently TestVar not a uint");`;	
	  }
   }

   mixin(mxnWrite_Size_t!"TestVar");
}

Output: TestVar

Confirm works for me.
Thanks!