This is moved/copied from the D.learning group. I need opinions on the matter, and thoughts perhaps from Walter or Andrei.

 Here are the highlights

---

While working on bitfields code I've found a unique scenario that poses some annoyances when generating the code.

template XYZ(alias x) {
    enum XYZ = x.stringof ~ "=100;";
}

struct I { int i;}

I i_num;
int n;

mixin(XYZ!(i_num.i)); //cannot find variable i
mixin(XYZ!(n));

the mixins become:
i=100;
n=100;

Now, how do I get the template's stringof to print out 'i_num.i' and not 'i'?

On Friday, 3 August 2012 at 21:19:08 UTC, David Nadlinger wrote:

You don't. Using .stringof in conjunction with string mixins is The Wrong Thing (tm) in virtually all cases.

What do you want to achieve? Why can't you pass a string instead?

Because a string doesn't hold it's type information for size checking.

On Friday, 3 August 2012 at 22:47:52 UTC, David Nadlinger wrote:
On Friday, 3 August 2012 at 22:23:23 UTC, Era Scarecrow wrote:
Seems like an ugly hack though (to get this done). Why not have another method of fullpathStringof or something similar? Then again if this is one of the few cases that could benefit from it, then maybe we should make it ugly so no one else will use it.

This can't work in general. What should such a function return? The fully qualified name, I.e. including packages and modules? What is if the referred to entity is a nested function/local variable? What is if it is defined in a module which is not imported in the place where the string is mixed in?

I would think, the exact 'text' of the way the variable was called, in my example it would be "inum.i", and since it would be at the local level (where the mixin was called) it should have access to everything that it did at that time.


On Friday, 3 August 2012 at 22:50:54 UTC, David Nadlinger wrote:
No, it shouldn't be. There are almost no legit use cases for it, and having it in the library encourages abuse of string mixins/stringof in cases like this one.

Then doesn't it seem like we're missing a potentially important piece of the puzzle for mixins and templates? very likely my modified template will include you including the same variable twice, but if someone gets lazy then it may not work.


True I can add asserts as part of the output code, but as mentioned hopefully the constraints could do that work, plus adding extra checks as part of a mixin seems a little... excessive, dirty and ugly.

Let's assume we use 'localStringof' or 'callingStringof' and that it returns the string of how the variable is called/referenced; Give me some examples how it would be abused or used wrongly? Aliased variables are pretty much perfect forwarded in templates (Unless my understanding is off) so they would carry that information forward.

Reply via email to