Reply to [email protected],
> http://d.puremagic.com/issues/show_bug.cgi?id=1211
>
> Summary: mixin("__LINE__")
> Product: D
> Version: 1.010
> Platform: Other
> OS/Version: Windows
> Status: NEW
> Severity: normal
> Priority: P2
> Component: DMD
> AssignedTo: [email protected]
> ReportedBy: [email protected]
> import std.stdio;
> void main() { writefln("%d", mixin("__LINE__")); }
> Expected output: 2
> Actual output: 1 (everywhere)
Well what would you expect? There is more than one option.
writef("%\n", mixin(string)); // 1, 3 or 4? what about generated strings?
const char[] string = "
__LINE__";
how about a dotted form?
<mixin_line>.<line_in_mixin>
Comment #2 by smjg — 2007-05-05T08:27:28Z
> writef("%\n", mixin(string)); // 1, 3 or 4? what about generated strings?
What is %\n? And how is 3 a plausible value in your example?
> how about a dotted form?
>
> <mixin_line>.<line_in_mixin>
Then how would we distinguish between 2.1 and 2.10?
IMO it should be the line in which it's mixed in, as that's the first point at which __LINE__ is treated as a token rather than being in a string. If you want the line where __LINE__ actually is in the code, you'd have to use
writef("%d\n", mixin(string)); // BTW what is %\n???
const char[] string = "
" ~ __LINE__.stringof;
This leaves:
- the line within the mixed-in code - if we're going to have this, it should probably be by a different token such as __MIXIN_LINE__.
- the line at which it would appear in the code after expansion of the mixin - but I don't see any practical use for this.
Comment #3 by davidl — 2007-05-05T09:03:03Z
how about
char[] a() {return `__LINE`;}
char[] b() {return `__`;}
mixin(a+b)
Comment #4 by smjg — 2007-05-05T09:54:52Z
The + operator doesn't work on strings, so what's to ask?
If you meant a ~ b, then how I stated it should work works equally in this case.