std.random question

biozic via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun May 3 03:10:33 PDT 2015


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
}
---


More information about the Digitalmars-d-learn mailing list