Re: Static Associative Array

2011-03-07 Thread Andrej Mitrovic
On 3/7/11, Jonathan M Davis  wrote:
> On Sunday 06 March 2011 18:33:04 Andrej Mitrovic wrote:
>> On 3/7/11, Jonathan M Davis  wrote:
>>
>>
>> Kidding, just kidding..
>
> That _did_ seem like a rather rude post for you...
>
> - Jonathan M Davis
>

Don't worry, I'd never be rude to my fellow D programmers out of the
blue. Maybe that post was a semi-rant, but only half-serious. :)
Anyway there's a nice SO post on enums here:
http://stackoverflow.com/questions/4790652/enum-vs-immutable-in-d/4793684#4793684


Re: Static Associative Array

2011-03-06 Thread spir

On 03/07/2011 03:22 AM, Peter Lundgren wrote:

== Quote from Jonathan M Davis (jmdavisp...@gmx.com)'s article

On Sunday 06 March 2011 14:05:04 Peter Lundgren wrote:

Can you define an associative array in a way that can be evaluated at
compile time like you can with non-associative arrays?

I'm pretty sure not. I think that it's currently suffering the same fate as 
stuff
like classes and is not yet able to be CTFEed. Some day...
- Jonathan M Davis


If not, then what is the D way to initialize a static field of a struct or 
class a
la Java's static initializer blocks? I don't mind constructing the associative
array at run-time if I have to, but I can't afford to do it more than the once 
needed.


Use the module's  clause:

int[string] aa;
static this () { aa = ["a":1, "b":2, "c":3]; }

unittest {
foreach (k,v ; aa)
writefln("%s --> %s", k,v);
}

Note: you can have as many such ckauses as you like.

Denis
--
_
vita es estrany
spir.wikidot.com



Re: Static Associative Array

2011-03-06 Thread Jonathan M Davis
On Sunday 06 March 2011 18:33:04 Andrej Mitrovic wrote:
> On 3/7/11, Jonathan M Davis  wrote:
> 
> 
> Kidding, just kidding..

That _did_ seem like a rather rude post for you...

- Jonathan M Davis


Re: Static Associative Array

2011-03-06 Thread Andrej Mitrovic
On 3/7/11, Jonathan M Davis  wrote:
>

Kidding, just kidding..


Re: Static Associative Array

2011-03-06 Thread bearophile
Peter Lundgren:

> If not, then what is the D way to initialize a static field of a struct or 
> class a
> la Java's static initializer blocks? I don't mind constructing the associative
> array at run-time if I have to, but I can't afford to do it more than the 
> once needed.

Is this good enough?

struct Foo {
static int[int] aa;
static this() {
aa[0] = 1;
}
}

void main() {
assert(Foo.aa[0] == 1);
}

Bye,
bearophile


Re: Static Associative Array

2011-03-06 Thread Jonathan M Davis
On Sunday 06 March 2011 18:22:52 Peter Lundgren wrote:
> == Quote from Jonathan M Davis (jmdavisp...@gmx.com)'s article
> 
> > On Sunday 06 March 2011 14:05:04 Peter Lundgren wrote:
> > > Can you define an associative array in a way that can be evaluated at
> > > compile time like you can with non-associative arrays?
> > 
> > I'm pretty sure not. I think that it's currently suffering the same fate
> > as stuff like classes and is not yet able to be CTFEed. Some day...
> > - Jonathan M Davis
> 
> If not, then what is the D way to initialize a static field of a struct or
> class a la Java's static initializer blocks? I don't mind constructing the
> associative array at run-time if I have to, but I can't afford to do it
> more than the once needed.

If you can initialize a field with CTFE, then you can do it directly. 
Otherwise, 
you have to do it with a constructor at runtime. If it's a member field of a 
struct or class, then you use a normal constructor.

class C
{
this() { ... }
}


If it's a static field of a struct or class, then you use a static constructor 
in 
that struct or class.

class C
{
static this() { ... }
}

If it's a variable at the module level, then you use a module constructor (also 
labeled with static).

static this() { ... }

- Jonathan M Davis


Re: Static Associative Array

2011-03-06 Thread Peter Lundgren
== Quote from Jonathan M Davis (jmdavisp...@gmx.com)'s article
> On Sunday 06 March 2011 14:05:04 Peter Lundgren wrote:
> > Can you define an associative array in a way that can be evaluated at
> > compile time like you can with non-associative arrays?
> I'm pretty sure not. I think that it's currently suffering the same fate as 
> stuff
> like classes and is not yet able to be CTFEed. Some day...
> - Jonathan M Davis

If not, then what is the D way to initialize a static field of a struct or 
class a
la Java's static initializer blocks? I don't mind constructing the associative
array at run-time if I have to, but I can't afford to do it more than the once 
needed.


Re: Static Associative Array

2011-03-06 Thread Jonathan M Davis
On Sunday 06 March 2011 16:30:00 Andrej Mitrovic wrote:
> What about:
> 
> enum : string[int]
> {
> aa = [1: "blue", 2: "red"]
> }
> 
> enum string s = aa[1];
> 
> void main()
> {
> writeln(s);
> }

In both cases, the AA does not exist past compile time. That may be why it 
works.

- Jonathan M Davis


Re: Static Associative Array

2011-03-06 Thread Andrej Mitrovic
What about:

enum : string[int]
{
aa = [1: "blue", 2: "red"]
}

enum string s = aa[1];

void main()
{
writeln(s);
}


Re: Static Associative Array

2011-03-06 Thread bearophile
Jonathan M Davis:

> I'm pretty sure not. I think that it's currently suffering the same fate as 
> stuff 
> like classes and is not yet able to be CTFEed. Some day...

This works:

import std.stdio;

string foo(int x) {
auto aa = [1: "hello", 2: "red"];
return aa[x];
}

enum string s = foo(1);

void main() {
writeln(s);
}


Bye,
bearophile


Re: Static Associative Array

2011-03-06 Thread Jonathan M Davis
On Sunday 06 March 2011 14:05:04 Peter Lundgren wrote:
> Can you define an associative array in a way that can be evaluated at
> compile time like you can with non-associative arrays?

I'm pretty sure not. I think that it's currently suffering the same fate as 
stuff 
like classes and is not yet able to be CTFEed. Some day...

- Jonathan M Davis


Static Associative Array

2011-03-06 Thread Peter Lundgren
Can you define an associative array in a way that can be evaluated at compile
time like you can with non-associative arrays?