Re: dcollections ArrayList pb with mixin template

2010-07-02 Thread Steven Schveighoffer
On Thu, 01 Jul 2010 18:26:06 -0400, bearophile bearophileh...@lycos.com  
wrote:



Steven Schveighoffer:
I think a member initializer has to be a constant expression, like int  
i =

1.  Anything else has to be done in the constructor.


There are the static constructors too, for modules, structs, classes.


static constructors don't help initialize member variables.

-Steve


dcollections ArrayList pb with mixin template

2010-07-01 Thread BLS
Hi, I have a problem with a mixin template. More exact with an 
Arraylist!T within a mixin template.

Given.
void main() {
auto p = new Person(Hans, 32);
p ~= new Person(Steve, 40);
p ~= new Person(Bjoern, 101);
}   

class Person {
private string _name;
private uint _age;

mixin TLinkList;

this(string name, uint age) {
this._name = name;
this._age = age;
}
}

mixin template TLinkList() {
alias typeof(this) T;
alias ArrayList!T TList;

T[] pa;
auto pl = new TList(pa);  // This does not work !
void opCatAssign(T v) {
pa ~= v;
}   
}
Error: non-constant expression new ArrayList(pa)main.d  

Ideas ?
Thanks Bjoern


Re: dcollections ArrayList pb with mixin template

2010-07-01 Thread Steven Schveighoffer

On Thu, 01 Jul 2010 15:36:53 -0400, BLS windev...@hotmail.de wrote:

Hi, I have a problem with a mixin template. More exact with an  
Arraylist!T within a mixin template.

Given.
void main() {
auto p = new Person(Hans, 32);
p ~= new Person(Steve, 40);
p ~= new Person(Bjoern, 101);
}   

class Person {
private string _name;
private uint _age;

mixin TLinkList;

this(string name, uint age) {
this._name = name;
this._age = age;
}
}

mixin template TLinkList() {
alias typeof(this) T;
alias ArrayList!T TList;

T[] pa;
auto pl = new TList(pa);  // This does not work !
void opCatAssign(T v) {
pa ~= v;
}   
}
Error: non-constant expression new ArrayList(pa)main.d  

Ideas ?
Thanks Bjoern


I'm thinking it has to do with you trying to create a member with that  
line.


I think a member initializer has to be a constant expression, like int i =  
1.  Anything else has to be done in the constructor.  This kinda sucks,  
because you can't initialize members with their defaults where you declare  
them, but it's the way D works.


-Steve


Re: dcollections ArrayList pb with mixin template

2010-07-01 Thread BLS

On 01/07/2010 22:59, Steven Schveighoffer wrote:

On Thu, 01 Jul 2010 15:36:53 -0400, BLS windev...@hotmail.de wrote:


Hi, I have a problem with a mixin template. More exact with an
Arraylist!T within a mixin template.
Given.
void main() {
auto p = new Person(Hans, 32);
p ~= new Person(Steve, 40);
p ~= new Person(Bjoern, 101);
}

class Person {
private string _name;
private uint _age;

mixin TLinkList;

this(string name, uint age) {
this._name = name;
this._age = age;
}
}

mixin template TLinkList() {
alias typeof(this) T;
alias ArrayList!T TList;

T[] pa;
auto pl = new TList(pa); // This does not work !
void opCatAssign(T v) {
pa ~= v;
}
}
Error: non-constant expression new ArrayList(pa) main.d

Ideas ?
Thanks Bjoern


I'm thinking it has to do with you trying to create a member with that
line.

I think a member initializer has to be a constant expression, like int i
= 1. Anything else has to be done in the constructor. This kinda sucks,
because you can't initialize members with their defaults where you
declare them, but it's the way D works.

-Steve

Thanks for the feedback Steve.
IMHO it should work.. One reason is that C.E. Miller has created a 
Circularly-linked list module, containing a portable linked list 
template mixin. Indeed Christophers implementation is  different in that 
the LinkList is part of the mixin template...


http://www.dprogramming.com/list.php

2) Commenting the auto pl = new TList() line out makes the snippet work.

mixin template TLinkList() {
alias typeof(this) T;
alias ArrayList!T TList;

T[] pa;
//auto pl = new TList(pa);  // NOW IT WORKS !
void opCatAssign(T v) {
pa ~= v;
}   
Well I am a D noob.  Have to investigate a bit more, and of course any 
help is welcome :)


Bjoern


Re: dcollections ArrayList pb with mixin template

2010-07-01 Thread bearophile
Steven Schveighoffer:
 I think a member initializer has to be a constant expression, like int i =  
 1.  Anything else has to be done in the constructor.

There are the static constructors too, for modules, structs, classes.

Bye,
bearophile


Re: dcollections ArrayList pb with mixin template

2010-07-01 Thread BLS

On 02/07/2010 00:26, bearophile wrote:

Steven Schveighoffer:

I think a member initializer has to be a constant expression, like int i =
1.  Anything else has to be done in the constructor.


There are the static constructors too, for modules, structs, classes.

Bye,
bearophile


Hi bearophile,
I don't understand (in this context) . Can you please elaborate a bit more ?

thanks bjoern


Re: dcollections ArrayList pb with mixin template

2010-07-01 Thread bearophile
BLS:
 I don't understand (in this context) . Can you please elaborate a bit more ?

I have not shown you code because I don't understand your context. But you can 
put inside static this() {...} code that can't be run statically, like the 
initialization of a run-time thing.

Bye,
bearophile