Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
February 23, 2016 constant expression | ||||
---|---|---|---|---|
| ||||
How is this not a constant expression ? auto ctodtypes = [ "void" : "void", "uint32_t" : "uint", "uint64_t" : "ulong", "int32_t" : "int", "int64_t" : "long", "char" : "char", "uint8_t" : "ubyte", "size_t" : "size_t", "float" : "float" ]; dmd complains source/emit/registryemitter.d(7): Error: non-constant expression ["void":"void", "uint32_t":"uint", "uint64_t":"ulong", "int32_t":"int", "int64_t":"long", "char":"char", "uint8_t":"ubyte", "size_t":"size_t", "float":"float"] |
February 22, 2016 Re: constant expression | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nicholas Wilson | On 02/22/2016 09:52 PM, Nicholas Wilson wrote:
> How is this not a constant expression ?
> auto ctodtypes =
> [
> "void" : "void",
> "uint32_t" : "uint",
> "uint64_t" : "ulong",
> "int32_t" : "int",
> "int64_t" : "long",
> "char" : "char",
> "uint8_t" : "ubyte",
> "size_t" : "size_t",
> "float" : "float"
> ];
> dmd complains
> source/emit/registryemitter.d(7): Error: non-constant expression
> ["void":"void", "uint32_t":"uint", "uint64_t":"ulong", "int32_t":"int",
> "int64_t":"long", "char":"char", "uint8_t":"ubyte", "size_t":"size_t",
> "float":"float"]
Because it's mutable: :)
ctodtypes["hello"] = "world";
What context are you using it in?
Ali
|
February 23, 2016 Re: constant expression | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Tuesday, 23 February 2016 at 07:26:01 UTC, Ali Çehreli wrote:
> On 02/22/2016 09:52 PM, Nicholas Wilson wrote:
>> How is this not a constant expression ?
>> auto ctodtypes =
>> [
>> "void" : "void",
>> "uint32_t" : "uint",
>> "uint64_t" : "ulong",
>> "int32_t" : "int",
>> "int64_t" : "long",
>> "char" : "char",
>> "uint8_t" : "ubyte",
>> "size_t" : "size_t",
>> "float" : "float"
>> ];
>> dmd complains
>> source/emit/registryemitter.d(7): Error: non-constant expression
>> ["void":"void", "uint32_t":"uint", "uint64_t":"ulong", "int32_t":"int",
>> "int64_t":"long", "char":"char", "uint8_t":"ubyte", "size_t":"size_t",
>> "float":"float"]
>
> Because it's mutable: :)
>
> ctodtypes["hello"] = "world";
>
> What context are you using it in?
>
> Ali
I've tried with both mutable and immutable a module scope. Scope I want is global (don't care about mutability)
|
February 22, 2016 Re: constant expression | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nicholas Wilson | On 02/22/2016 11:38 PM, Nicholas Wilson wrote:
> I've tried with both mutable and immutable a module scope. Scope I want
> is global (don't care about mutability)
>
Uncomment immutable if you want immutable and remove 'shared' if you want multiple of this per thread (probably not).
/* immutable */ string[string] ctodtypes;
shared static this() {
ctodtypes =
[
"void" : "void",
"uint32_t" : "uint",
"uint64_t" : "ulong",
"int32_t" : "int",
"int64_t" : "long",
"char" : "char",
"uint8_t" : "ubyte",
"size_t" : "size_t",
"float" : "float"
];
}
void main() {
ctodtypes["hello"] = "world";
}
Ali
|
February 23, 2016 Re: constant expression | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Tuesday, 23 February 2016 at 07:43:37 UTC, Ali Çehreli wrote:
> On 02/22/2016 11:38 PM, Nicholas Wilson wrote:
>
>> I've tried with both mutable and immutable a module scope. Scope I want
>> is global (don't care about mutability)
>>
>
> Uncomment immutable if you want immutable and remove 'shared' if you want multiple of this per thread (probably not).
>
> /* immutable */ string[string] ctodtypes;
>
> shared static this() {
> ctodtypes =
> [
> "void" : "void",
> "uint32_t" : "uint",
> "uint64_t" : "ulong",
> "int32_t" : "int",
> "int64_t" : "long",
> "char" : "char",
> "uint8_t" : "ubyte",
> "size_t" : "size_t",
> "float" : "float"
> ];
> }
>
> void main() {
> ctodtypes["hello"] = "world";
> }
>
> Ali
Thanks
Silly question. Why is this necessary?
|
February 23, 2016 Re: constant expression | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nicholas Wilson | On 2/23/16 3:00 AM, Nicholas Wilson wrote:
> On Tuesday, 23 February 2016 at 07:43:37 UTC, Ali Çehreli wrote:
>> On 02/22/2016 11:38 PM, Nicholas Wilson wrote:
>>
>>> I've tried with both mutable and immutable a module scope. Scope I want
>>> is global (don't care about mutability)
>>>
>>
>> Uncomment immutable if you want immutable and remove 'shared' if you
>> want multiple of this per thread (probably not).
>>
>> /* immutable */ string[string] ctodtypes;
>>
>> shared static this() {
>> ctodtypes =
>> [
>> "void" : "void",
>> "uint32_t" : "uint",
>> "uint64_t" : "ulong",
>> "int32_t" : "int",
>> "int64_t" : "long",
>> "char" : "char",
>> "uint8_t" : "ubyte",
>> "size_t" : "size_t",
>> "float" : "float"
>> ];
>> }
>>
>> void main() {
>> ctodtypes["hello"] = "world";
>> }
>>
>> Ali
>
> Thanks
>
> Silly question. Why is this necessary?
D cannot create associative arrays at compile time that can be used during runtime. You have to create them at runtime.
It could probably do effectively what is done above, however. Just nobody has made that enhancement.
-Steve
|
February 24, 2016 Re: constant expression | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nicholas Wilson | On Tuesday, 23 February 2016 at 08:00:24 UTC, Nicholas Wilson wrote:
> Silly question. Why is this necessary?
Due to a problem with the implementation, associative arrays currently can't be initialized statically. We hope it will eventually get fixed, but until then, you have to use module constructors as a workaround.
|
Copyright © 1999-2021 by the D Language Foundation