On Friday, 23 August 2013 at 20:42:20 UTC, H. S. Teoh wrote:
On Fri, Aug 23, 2013 at 10:18:53PM +0200, Timon Gehr wrote:
On 08/23/2013 07:27 PM, Peter Alexander wrote:
> […]
>There's quite a few unresolved issues!

Add compile-time reflection.

I thought __traits solved that problem? In an ugly way, perhaps, but is
there something that can't be solved with __traits?

The problem is that the language does not define how to deal with "forward references". At all.

There are lots of cases where this matters in practice, for example when using the information obtained by __traits(allMembers, T) to add a new member to T (e.g. in a serialization library). But the canonical example probably is simply:
–––
static if (!is(typeof(b))) enum a = 0;
static if (!is(typeof(a))) enum b = 0;
// What is defined? a? b? both? Or is this illegal code?
–––

Right now, DMD is rather liberal in what it accepts, but what exactly is legal is not clear, and evaluation order is completely unspecified. This is a huge problem, as you end up writing a piece of code and seeing that it compiles fine and behaves as you would intuitively expect, assume that it is legal, only to have the compiler choke on it or behave differently when the next release comes out.

David

Reply via email to