www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - std.random question

reply "tired_eyes" <pastuhov85 gmail.com> writes:
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
May 03 2015
parent reply "Dennis Ritchie" <dennis.ritchie mail.ru> writes:
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); }
May 03 2015
parent reply "tired_eyes" <pastuhov85 gmail.com> writes:
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.
May 03 2015
parent reply "Dennis Ritchie" <dennis.ritchie mail.ru> writes:
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: import std.stdio, std.random; struct Mystruct { //mixin(`auto id = uniform(0, 10);`); // Error: static variable initialized cannot be read at compile time int val; } void main() { Mystruct test; test.val = uniform(0, 10); // OK writeln(test.val); mixin(`auto n = uniform(0, 10);`); // OK }
May 03 2015
next sibling parent "tired_eyes" <pastuhov85 gmail.com> writes:
Hmmm.

hap.random from http://code.dlang.org/packages/hap behaves 
exactly the same.
May 03 2015
prev sibling parent reply "biozic" <dransic gmail.com> writes:
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 } ---
May 03 2015
parent "tired_eyes" <pastuhov85 gmail.com> writes:
 import std.random;

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

 void main() {
     auto s = Mystruct();
 	// whatever
 }
 ---
This make sense, thant you for the explanation.
May 03 2015