Steven Schveighoffer wrote:
On Thu, 28 May 2009 12:11:18 -0400, Ary Borenszweig <a...@esperanto.org.ar> wrote:

Steven Schveighoffer wrote:
On Thu, 28 May 2009 11:32:19 -0400, Ary Borenszweig <a...@esperanto.org.ar> wrote:

Unknown W. Brackets wrote:
Probably a silly idea, but what about (or similar):
 static this: mod.name, mod.name2, mod.name3
{
}
For a dependency list. I may be wrong, but afaik the main problems stem from either wrong order or co-dependence (which needs to be solved by the programmer.) At least with this, you could ask the compiler for an order, potentially. If the other modules had no static this, it could ignore it, allowing future proofing.
 But, maybe that's an ugly hack.
 -[Unknown]
  davidl wrote:
Why on earth we still let the tumor grow?
I would love to specify the order by myself not by the arbitrary order
generated by the compiler.


Hi,

Can someone explain me what is exactly the problems with static this? Something like a small example that shows the problem, so I can at least think of a solution (because I don't know the problem).

Thanks!
Ary
  Something like:
 file1.d:
 import file2.d;
 static this()
{
}
 file2.d:
 import file1.d;
 static this()
{
}
fails to compile due to the perceived circular dependency, even though none exists.

Thanks, yes, it fails to run. But why? What could happen if that error wasn't issued? I'm looking for an example where something wrong could happen.

I gave you the case which *should* compile, here is a case Walter is trying to prevent:

file1.d:
import file2;

int x;
static this()
{
  x = y;
}

file2.d:

int y;
static this()
{
  y = x;
}

This is an obvious case, it doesn't take much imagination to envision one that's not so obvious.

I'm starting to understand the problem. In this example I think I can describe better the real problem:

file1.d:
import file2;

int x;
static this() {
  x = y + 10;
}

file2:d
int y;
static this() {
  y = 20;
}

In this case the programmer expects y to be 20, and x to be 30 (since file1 references file2, it expects to run the static this of file2 first). And this one compiles fine because file2 doesn't import file1.

As soon as file2 imports file1, you get the error, *even though no symbol of file1 that is referenced in a file1's static this has been referenced in file2's static this*.

Isn't this the real problem? For this solution the compiler should maintain references to modules only if they are referenced in the static if's, so for this example it would be:

file1 -> { file2 }
file2 -> {}

so there's no circularity. For your example it would be:

file1 -> { file2 }
file2 -> { file1 }

and there's a circularity, and you get a *compile* error (I think this will always be a real error).

Of course this gets complicated if the static this invokes functions, maybe it creates instances of classes, cast them to interfaces or to base classes, and then invoke some method and now you can't tell which variables are referenced. But I can't truly imagine a case where this will be a problem. And if it is, then there's something wrong in your initialization logic, that is, a bug, and you should fix it. But most of the time, I think, there won't be problems.

Is there something wrong in my reasoning?

Reply via email to