On Sunday, 1 May 2016 at 13:22:27 UTC, Mithun Hunsur wrote:
On Sunday, 1 May 2016 at 10:37:23 UTC, Anonymouse wrote:
On Sunday, 1 May 2016 at 05:28:36 UTC, Mithun Hunsur wrote:
Hi all,
I'm working on removing the string mixins from my code, but
have run into an issue:
http://dpaste.dzfl.pl/ecd7eb53947e
As far as I can tell, this should work; the enum should force
compile-time execution (which it does, as evidenced by the
pragma). [...]
That does seem buggy but I don't know enough to say for
certain. I'd suggest filing a bug report anyway; the worst
thing that can happen is that it gets closed. Unreported bugs
can only be fixed by accident.
Tacking an .idup after .toLower seems to make it work, at
least on dpaste (http://dpaste.dzfl.pl/8abed3d3ec6c). I would
have thought both toLower and idup returned a normal string,
but unsure.
enum loweredName = member.to!string.toLower.idup;
pragma(msg, loweredName);
if (member == test)
return loweredName;
Yup - that works. How odd! Along the same lines is
enum loweredName = "" ~ member.to!string.toLower;
which also works without issues. This makes me think that the
result of `member.to!string.toLower` isn't being treated as a
string, despite being typed as one - and by using `idup` or
concatenating to it, we essentially retype it as a string.
Another solution:
----
import std.traits;
import std.conv;
import std.uni;
import std.stdio;
enum Test { A, B, C }
auto enumToString(Test test) @nogc nothrow
{
@property string function() result = {return "";};
foreach (member; EnumMembers!Test)
{
if (member == test)
{
result = {return member.to!string.toLower;};
break;
}
}
return result;
}
void main()
{
enumToString(Test.A)().writeln;
}
----
returns a delegate, although the call is quite unfriendly,
despite of the @property.