On Sunday, 3 May 2015 at 09:28:40 UTC, Dennis Ritchie wrote:
On Sunday, 3 May 2015 at 09:04:07 UTC, tired_eyes wrote:
On Sunday, 3 May 2015 at 08:48:52 UTC, Dennis Ritchie wrote:
On Sunday, 3 May 2015 at 08:42:57 UTC, tired_eyes wrote:
Feels pretty silly, but I can't compile this:


import std.random;
auto i = uniform(0, 10);


DMD spits this:

/usr/include/dmd/phobos/std/random.d(1188): Error: static variable initialized cannot be read at compile time /usr/include/dmd/phobos/std/random.d(1231): called from here: rndGen() /usr/include/dmd/phobos/std/random.d(1231): called from here: uniform(a, b, rndGen())


Perhaps I'm missing something obvious?
dmd 2.067.1, openSUSE 13.2 x64

void main() {
        import std.random;
        auto i = uniform(0, 10);
}

Not so simple, unfortunately.
Actual code:


import std.random;

struct Mystruct {
   auto id = uniform(0, 10);
}

void main() {
   // wahtever
}


..and no luck.

I think it is a bug:

No. The aboc code defines a field of Mystruct calld 'id', with a type inferred from the static initializer expression 'uniform(0, 10)'. The problem is that a static initializer is... static! So the expression must be evaluated at compile-time. The uniform generator from std.random cannot be used at compile-time, thus the error.

You could do:
---
import std.random;

struct Mystruct {
        int id;
        
        static opCall() {
                Mystruct s;
                s.id = uniform(0, 10);
                return s;
        }
}

void main() {
    auto s = Mystruct();
        // whatever
}
---

Reply via email to