On 6/5/15 10:15 AM, Dennis Ritchie wrote:
On Friday, 5 June 2015 at 13:13:15 UTC, Steven Schveighoffer wrote:
string foo(string mode, string value)
{
   return `writefln("mode ` ~ mode ~ `: %s", ` ~ value ~ `);`;
}

void main()
{
   mixin(foo("Y", "3"));
   mixin(foo("X", "2"));
}

Thanks. It looks really simple, but I still do not understand the
concept of using mixins in full.

I do not understand why in this line:
return `writefln("mode ` ~ mode ~ `: %s", ` ~ value ~ `);`;

use the following syntax:
~ mode ~ , ~ value ~

Because what foo is constructing is a string that makes sense in the *caller*, not inside foo. What those statements do is concat the *value* of mode (i.e. "Y" or "X") and the *value* of value (i.e. "3" or "2") to the string.

It's equivalent to rust using the ${e} to do variable substitution.

For example, why here I can simply write:

void main() {
     int b = 5;
     mixin(`int a = b;`);
     assert(a == 5);
}

Because b makes sense in the context of main.

Why should not I write like this:

void main() {
     int b = 5;
     mixin(`"int a = " ` ~ b ~ ` ";"`);
     assert(a == 5);
}

Because it won't compile :) Mixin strings must be constructable at compile time, the value of b depends on runtime. Not to mention that you can't concat strings with ints.

-Steve

Reply via email to