Re: Add Element to list not Working

2012-04-02 Thread Ali Çehreli

On 04/01/2012 10:45 PM, Chris Pons wrote:

I'm trying to add an element to a list with insert but that doesn't seem
to do anything at all. If I try using ~= it says that Error: cannot
append type Node to type SList!(Node). I'm pretty confused about using
~= because it works fine for arrays but apperantly not for lists.

How do I add an element to a list?


import std.stdio;
import std.container;

void main()
{
auto l = SList!int();

l.insert(42);// inserts front
l.insert(43);// this too

assert(l == SList!int(43, 42));

// inserts after the specified range (l[] is the entire list)
l.insertAfter(l[], 44);

assert(l == SList!int(43, 42, 44));

// This doesn't work because SList.Range doesn't define opOpAssign!~
// l[] ~= 45;
}

Ali


Re: Add Element to list not Working

2012-04-02 Thread James Miller
On 2 April 2012 17:45, Chris Pons cmp...@gmail.com wrote:
 I'm trying to add an element to a list with insert but that doesn't seem to
 do anything at all. If I try using ~= it says that Error: cannot append
 type Node to type SList!(Node). I'm pretty confused about using ~= because
 it works fine for arrays but apperantly not for lists.

 How do I add an element to a list?

opAppend (or whatever it is) isn't defined for alot of types that it
probably should be. There should be an append method that you can use
though.

--
James Miller


Re: Add Element to list not Working

2012-04-02 Thread Chris Pons

Thanks. I tried doing this and the list didn't update:

void AddToList( SList!int list, int i )
{
list.insert( i );
}

SList!int intList;

AddToList( intList, 42 );

but when I switched to this, it worked:

SList!int intList;

void AddToList( int i )
{
intList.insert( i );
}

AddToList( 42 );

The first method didn't give an error it just didn't update the 
list as I thought. Any idea?


On Monday, 2 April 2012 at 06:07:40 UTC, Ali Çehreli wrote:

On 04/01/2012 10:45 PM, Chris Pons wrote:
I'm trying to add an element to a list with insert but that 
doesn't seem
to do anything at all. If I try using ~= it says that Error: 
cannot
append type Node to type SList!(Node). I'm pretty confused 
about using
~= because it works fine for arrays but apperantly not for 
lists.


How do I add an element to a list?


import std.stdio;
import std.container;

void main()
{
auto l = SList!int();

l.insert(42);// inserts front
l.insert(43);// this too

assert(l == SList!int(43, 42));

// inserts after the specified range (l[] is the entire 
list)

l.insertAfter(l[], 44);

assert(l == SList!int(43, 42, 44));

// This doesn't work because SList.Range doesn't define 
opOpAssign!~

// l[] ~= 45;
}

Ali





Re: Add Element to list not Working

2012-04-02 Thread Ali Çehreli

On 04/01/2012 11:18 PM, Chris Pons wrote:
 Thanks. I tried doing this and the list didn't update:

 void AddToList( SList!int list, int i )
 {
 list.insert( i );
 }

Oh, that has nothing to do with SList. SList is a struct and as a 
fundamental rule of D, structs are copied to functions. SList happens to 
be a struct. The list parameter of AddToList and the list variable that 
is passed to the function as an argument are two different variables.



 SList!int intList;

 AddToList( intList, 42 );

 but when I switched to this, it worked:

 SList!int intList;

 void AddToList( int i )
 {
 intList.insert( i );
 }

Global variables are not a good solution of course. :(

The solution here is to pass the argument by-reference by the 'ref' keyword:

void AddToList( ref SList!int list, int i )
{
// ...
}

Ali

P.S. There is this chapter that covers 'ref' and most (but not all) 
types of function parameters:


  http://ddili.org/ders/d.en/function_parameters.html



Re: Add Element to list not Working

2012-04-02 Thread Chris Pons
Ah, thank you. I didn't realize taht SList is a struct and that 
it used value semantics. That clears this up.


On Monday, 2 April 2012 at 14:22:25 UTC, Ali Çehreli wrote:

On 04/01/2012 11:18 PM, Chris Pons wrote:
 Thanks. I tried doing this and the list didn't update:

 void AddToList( SList!int list, int i )
 {
 list.insert( i );
 }

Oh, that has nothing to do with SList. SList is a struct and as 
a fundamental rule of D, structs are copied to functions. SList 
happens to be a struct. The list parameter of AddToList and the 
list variable that is passed to the function as an argument are 
two different variables.



 SList!int intList;

 AddToList( intList, 42 );

 but when I switched to this, it worked:

 SList!int intList;

 void AddToList( int i )
 {
 intList.insert( i );
 }

Global variables are not a good solution of course. :(

The solution here is to pass the argument by-reference by the 
'ref' keyword:


void AddToList( ref SList!int list, int i )
{
// ...
}

Ali

P.S. There is this chapter that covers 'ref' and most (but not 
all) types of function parameters:


  http://ddili.org/ders/d.en/function_parameters.html





Re: Add Element to list not Working

2012-04-02 Thread Jonathan M Davis
On Monday, April 02, 2012 20:27:18 Chris Pons wrote:
 Ah, thank you. I didn't realize taht SList is a struct and that
 it used value semantics. That clears this up.

It really shouldn't be using value semantics (though it wouldn't surprise me 
if it is - I haven't used it). std.container's containers are supposed to be 
reference types, but how that's going to be implemented exactly is still in 
flux - in part due to the pending custom allocator design. In the long run, 
std.container's containers will likely be ref-counted structs in the long run, 
but they may end up being classes.

- Jonathan M Davis


Add Element to list not Working

2012-04-01 Thread Chris Pons
I'm trying to add an element to a list with insert but that 
doesn't seem to do anything at all. If I try using ~= it says 
that Error: cannot append type Node to type SList!(Node). I'm 
pretty confused about using ~= because it works fine for arrays 
but apperantly not for lists.


How do I add an element to a list?