On Saturday, 3 September 2016 at 14:13:27 UTC, Lodovico Giaretta
wrote:
On Saturday, 3 September 2016 at 14:06:06 UTC, Igor wrote:
Can anyone explain in plain English how does compiler process
and detect a "test.d(6) Error: forward reference of variable
a" in following code:
import std.stdio;
enum a = 1 + b;
enum d = 5 + a; // No error here
enum b = 12 + c;
enum c = 10 + a; // error here
void main()
{
writeln("Hello World!", b);
}
a needs b to be initialized. So b must be initialized before a.
Let's write this b->a. Now b needs c. So c->b. c needs a, so
a->c. If we sum everything, we have that a->c->b->a. This mean
that to initialize a we need b, to initialize b we need c, but
to initialize c we need a. So to initialize a we need a, which
is not possible. We need a before having initialized it.
On the other hand, a->d is not a problem, as d can be
initialized after a.
So, you are saying compiler is keeping a kind of linked list of
dependencies and then checks if any of those lists are circular?
But how exactly would that list be structured since one
expression can have multiple dependencies, like:
enum a = b + c + d + e;
enum b = 10 + c;
enum c = d + e + a;
...