Re: Error with associative array initializer DMD32 D Compiler v2.070.0

2016-03-03 Thread Ali Çehreli via Digitalmars-d-learn

On 03/03/2016 05:17 AM, Andrew Edwards wrote:
> On 3/3/16 7:01 PM, MGW wrote:
>> immutable long[string] aa = [
>> "foo": 5,
>> "bar": 10,
>> "baz": 2000
>> ];
>
> The only way this can be done outside the body of a function is if it is
> a manifest constant. This works:
>
> enum long[string] aa = [
>  "foo": 5,
>  "bar": 10,
>  "baz": 2000
> ];

With the caveat that 'aa' is a manifest constant, meaning that its 
values will be placed everywhere 'aa' appears in code. So, the following 
loop *creates* an associative array at avery iteration:


while (/* ... */) {
if (aa[s] == 5) {  // <-- oops :(
// ...
}
}

I think initializing it in a 'shared static this()' (or 'static this()') 
block is better:


immutable long[string] aa;

shared static this() {
aa = [
"foo": 5,
"bar": 10,
"baz": 2000
];
}

void main() {
assert(aa["foo"] == 5);
}

Ali



Re: Error with associative array initializer DMD32 D Compiler v2.070.0

2016-03-03 Thread Andrew Edwards via Digitalmars-d-learn

On 3/3/16 7:01 PM, MGW wrote:

immutable long[string] aa = [
"foo": 5,
"bar": 10,
"baz": 2000
];


The only way this can be done outside the body of a function is if it is 
a manifest constant. This works:


enum long[string] aa = [
"foo": 5,
"bar": 10,
"baz": 2000
];


Re: Error with associative array initializer DMD32 D Compiler v2.070.0

2016-03-03 Thread mahdi via Digitalmars-d-learn

On Thursday, 3 March 2016 at 10:35:50 UTC, MGW wrote:

The citation from https://dlang.org/spec/hash-map.html

Static Initialization of AAs


immutable long[string] aa = [
  "foo": 5,
  "bar": 10,
  "baz": 2000
];

unittest
{
assert(aa["foo"] == 5);
assert(aa["bar"] == 10);
assert(aa["baz"] == 2000);
}

Judging by the text, it is static initialization, during 
compilation.


You have to put that definition inside body of a function (a 
declaration). it should not be placed inside module's root level 
code.


Re: Error with associative array initializer DMD32 D Compiler v2.070.0

2016-03-03 Thread asdf via Digitalmars-d-learn

On Thursday, 3 March 2016 at 10:35:50 UTC, MGW wrote:

The citation from https://dlang.org/spec/hash-map.html

Static Initialization of AAs


immutable long[string] aa = [
  "foo": 5,
  "bar": 10,
  "baz": 2000
];

unittest
{
assert(aa["foo"] == 5);
assert(aa["bar"] == 10);
assert(aa["baz"] == 2000);
}

Judging by the text, it is static initialization, during 
compilation.


Hey your right! https://dlang.org/spec/hash-map.html

I don't actually understand D that much but runtime logic made 
sense...


That unit test passes somehow, perhaps because unit test are 
executed? Looks like a bug in the test and/or documentation!


Re: Error with associative array initializer DMD32 D Compiler v2.070.0

2016-03-03 Thread MGW via Digitalmars-d-learn

The citation from https://dlang.org/spec/hash-map.html

Static Initialization of AAs


immutable long[string] aa = [
  "foo": 5,
  "bar": 10,
  "baz": 2000
];

unittest
{
assert(aa["foo"] == 5);
assert(aa["bar"] == 10);
assert(aa["baz"] == 2000);
}

Judging by the text, it is static initialization, during 
compilation.




Re: Error with associative array initializer DMD32 D Compiler v2.070.0

2016-03-03 Thread asdf via Digitalmars-d-learn

On Thursday, 3 March 2016 at 10:01:47 UTC, MGW wrote:

immutable long[string] aa = [
   "foo": 5,
   "bar": 10,
   "baz": 2000
];

... Error: non-constant expression ["foo":5L, "bar":10L, 
"baz":2000L]


D associative arrays are a dynamic runtime feature, thus can't be 
initialized without runtime expressions. :(


This ended up failing too:

struct slot_t { char* key; long value; };

slot_t bogus[3] = {
{ "foo", 5L },
{ "bar", 10L },
{ "baz", 2000L }
};

import std.stdio;

void main() {
bogus.map.writeln();
}


Re: Error with associative array initializer DMD32 D Compiler v2.070.0

2016-03-03 Thread Anonymouse via Digitalmars-d-learn

On Thursday, 3 March 2016 at 10:01:47 UTC, MGW wrote:

immutable long[string] aa = [
   "foo": 5,
   "bar": 10,
   "baz": 2000
];

... Error: non-constant expression ["foo":5L, "bar":10L, 
"baz":2000L]


I'm not sure there's a way around this except by initialising it 
at runtime. So you can't get it in the rom segment.


immutable long[string] aa;

shared static this() {
aa = [
"foo": 5,
"bar": 10,
"baz": 2000
];
}



Error with associative array initializer DMD32 D Compiler v2.070.0

2016-03-03 Thread MGW via Digitalmars-d-learn

immutable long[string] aa = [
   "foo": 5,
   "bar": 10,
   "baz": 2000
];

... Error: non-constant expression ["foo":5L, "bar":10L, 
"baz":2000L]