Re: [rust-dev] Define copyable types for [T, ..2] static vector initialization

2013-12-09 Thread Niko Matsakis
On Sat, Nov 30, 2013 at 12:53:24AM -0500, Ashish Myles wrote:
 I have been waiting on integer parameters on traits since I first ran
 into Rust, but the rust team might be avoiding that to prevent getting
 Turing complete generics/templates.

I assume we'll get to it eventually.


Niko
___
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev


Re: [rust-dev] Define copyable types for [T, ..2] static vector initialization

2013-11-29 Thread Daniel Micay
On Fri, Nov 29, 2013 at 6:33 PM, Ashish Myles marci...@gmail.com wrote:
 Previously we had the Copy trait, which when implemented by trait T
 allowed one to write
 [Zero::zero(), ..SZ] where T implemented the Zero trait.  But now I am
 not sure how to get that behavior.  Concretely, here is the code I
 want to get compiling. (Just to check, I added both Clone and
 DeepClone, even though they don't automatically allow implicit
 copyability).

 
 use std::num::Zero;

 enum Constants {
 SZ = 2
 }

 struct FooT([T, ..SZ]);

 implT : Clone + DeepClone + Zero FooT {
 pub fn new() - FooT {
 Foo([Zero::zero(), ..SZ])
 }
 }
 

 The error I get is:

 error: copying a value of non-copyable type `T`
 tmp.rs:155 Foo([Zero::zero(), ..SZ])


 Any way to do this? Or is this no longer supported for general types?
 Any intentions to add this behavior again?  Otherwise, I can't even
 initialize my struct while being agnostic to the specific value of SZ.

 Ashish

The `Clone` and `DeepClone` traits are defined entirely in the
standard library. Of course, another issue is that fixed-size vectors
can't have methods implemented on them at the moment.
___
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev


Re: [rust-dev] Define copyable types for [T, ..2] static vector initialization

2013-11-29 Thread Huon Wilson

On 30/11/13 10:33, Ashish Myles wrote:

Previously we had the Copy trait, which when implemented by trait T
allowed one to write
[Zero::zero(), ..SZ] where T implemented the Zero trait.  But now I am
not sure how to get that behavior.  Concretely, here is the code I
want to get compiling. (Just to check, I added both Clone and
DeepClone, even though they don't automatically allow implicit
copyability).


use std::num::Zero;

enum Constants {
 SZ = 2
}

struct FooT([T, ..SZ]);

implT : Clone + DeepClone + Zero FooT {
 pub fn new() - FooT {
 Foo([Zero::zero(), ..SZ])
 }
}


The error I get is:

error: copying a value of non-copyable type `T`
tmp.rs:155 Foo([Zero::zero(), ..SZ])


Any way to do this? Or is this no longer supported for general types?
Any intentions to add this behavior again?  Otherwise, I can't even
initialize my struct while being agnostic to the specific value of SZ.

Ashish
___
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev


Initialising a fixed size vector [T, ..n] by [foo(), .. n] unfortunately 
requires that `T` is implicitly copyable (that is, it doesn't move 
ownership when passed by value), and there's no way around this other 
than [foo(), foo(), foo(),...].



Huon
___
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev


Re: [rust-dev] Define copyable types for [T, ..2] static vector initialization

2013-11-29 Thread Ashish Myles
Is there a plan to support fix-sized vector initialization without manual
replication?  My example is just a simplified version -- this was part of a
macro that takes the size as input ($n:expr) and the initialization was
[Zero::zero(), .. $n].  Is this use case no longer intended to be
supported?
On Nov 29, 2013 6:47 PM, Huon Wilson dbau...@gmail.com wrote:

 On 30/11/13 10:33, Ashish Myles wrote:

 Previously we had the Copy trait, which when implemented by trait T
 allowed one to write
 [Zero::zero(), ..SZ] where T implemented the Zero trait.  But now I am
 not sure how to get that behavior.  Concretely, here is the code I
 want to get compiling. (Just to check, I added both Clone and
 DeepClone, even though they don't automatically allow implicit
 copyability).

 
 use std::num::Zero;

 enum Constants {
  SZ = 2
 }

 struct FooT([T, ..SZ]);

 implT : Clone + DeepClone + Zero FooT {
  pub fn new() - FooT {
  Foo([Zero::zero(), ..SZ])
  }
 }
 

 The error I get is:

 error: copying a value of non-copyable type `T`
 tmp.rs:155 Foo([Zero::zero(), ..SZ])


 Any way to do this? Or is this no longer supported for general types?
 Any intentions to add this behavior again?  Otherwise, I can't even
 initialize my struct while being agnostic to the specific value of SZ.

 Ashish
 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev


 Initialising a fixed size vector [T, ..n] by [foo(), .. n] unfortunately
 requires that `T` is implicitly copyable (that is, it doesn't move
 ownership when passed by value), and there's no way around this other than
 [foo(), foo(), foo(),...].


 Huon
 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev

___
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev


Re: [rust-dev] Define copyable types for [T, ..2] static vector initialization

2013-11-29 Thread Kevin Ballard
If you're willing to use unsafe code and std::unstable, you can do it.

use std::num::Zero;
use std::unstable::intrinsics;

enum Constants {
SZ = 2
}

struct FooT([T, ..SZ]);

implT: Clone + DeepClone + Zero FooT {
pub fn new() - FooT {
let mut ary: [T, ..SZ];
unsafe {
ary = intrinsics::uninit();
for i in range(0u, SZ as uint) {
intrinsics::move_val_init(mut ary[i], Zero::zero());
}
}
Foo(ary)
}
}

-Kevin

On Nov 29, 2013, at 7:05 PM, Ashish Myles marci...@gmail.com wrote:

 Is there a plan to support fix-sized vector initialization without manual 
 replication?  My example is just a simplified version -- this was part of a 
 macro that takes the size as input ($n:expr) and the initialization was 
 [Zero::zero(), .. $n].  Is this use case no longer intended to be supported?
 
 On Nov 29, 2013 6:47 PM, Huon Wilson dbau...@gmail.com wrote:
 On 30/11/13 10:33, Ashish Myles wrote:
 Previously we had the Copy trait, which when implemented by trait T
 allowed one to write
 [Zero::zero(), ..SZ] where T implemented the Zero trait.  But now I am
 not sure how to get that behavior.  Concretely, here is the code I
 want to get compiling. (Just to check, I added both Clone and
 DeepClone, even though they don't automatically allow implicit
 copyability).
 
 
 use std::num::Zero;
 
 enum Constants {
  SZ = 2
 }
 
 struct FooT([T, ..SZ]);
 
 implT : Clone + DeepClone + Zero FooT {
  pub fn new() - FooT {
  Foo([Zero::zero(), ..SZ])
  }
 }
 
 
 The error I get is:
 
 error: copying a value of non-copyable type `T`
 tmp.rs:155 Foo([Zero::zero(), ..SZ])
 
 
 Any way to do this? Or is this no longer supported for general types?
 Any intentions to add this behavior again?  Otherwise, I can't even
 initialize my struct while being agnostic to the specific value of SZ.
 
 Ashish
 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev
 
 Initialising a fixed size vector [T, ..n] by [foo(), .. n] unfortunately 
 requires that `T` is implicitly copyable (that is, it doesn't move ownership 
 when passed by value), and there's no way around this other than [foo(), 
 foo(), foo(),...].
 
 
 Huon
 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev
 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev



smime.p7s
Description: S/MIME cryptographic signature
___
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev


Re: [rust-dev] Define copyable types for [T, ..2] static vector initialization

2013-11-29 Thread Ashish Myles
That's some seriously nifty stuff, which got my stuff compiling again. :)

But for the long term, it would be nice to have a syntax that behaves
as was the case with the Copy trait -- it takes a single value and
clones it into the elements of the static array.  Or perhaps the
developers disagree and consider it to be a niche use (static arrays
with sizes known a-priori when writing the code) -- it would be good
to get some clarity on this.

Thanks,
Ashish


On Fri, Nov 29, 2013 at 10:20 PM, Kevin Ballard ke...@sb.org wrote:
 If you're willing to use unsafe code and std::unstable, you can do it.

 use std::num::Zero;
 use std::unstable::intrinsics;


 enum Constants {
 SZ = 2
 }

 struct FooT([T, ..SZ]);

 implT: Clone + DeepClone + Zero FooT {
 pub fn new() - FooT {
 let mut ary: [T, ..SZ];
 unsafe {
 ary = intrinsics::uninit();
 for i in range(0u, SZ as uint) {
 intrinsics::move_val_init(mut ary[i], Zero::zero());
 }
 }
 Foo(ary)
 }
 }

 -Kevin

 On Nov 29, 2013, at 7:05 PM, Ashish Myles marci...@gmail.com wrote:

 Is there a plan to support fix-sized vector initialization without manual
 replication?  My example is just a simplified version -- this was part of a
 macro that takes the size as input ($n:expr) and the initialization was
 [Zero::zero(), .. $n].  Is this use case no longer intended to be supported?

 On Nov 29, 2013 6:47 PM, Huon Wilson dbau...@gmail.com wrote:

 On 30/11/13 10:33, Ashish Myles wrote:

 Previously we had the Copy trait, which when implemented by trait T
 allowed one to write
 [Zero::zero(), ..SZ] where T implemented the Zero trait.  But now I am
 not sure how to get that behavior.  Concretely, here is the code I
 want to get compiling. (Just to check, I added both Clone and
 DeepClone, even though they don't automatically allow implicit
 copyability).

 
 use std::num::Zero;

 enum Constants {
  SZ = 2
 }

 struct FooT([T, ..SZ]);

 implT : Clone + DeepClone + Zero FooT {
  pub fn new() - FooT {
  Foo([Zero::zero(), ..SZ])
  }
 }
 

 The error I get is:

 error: copying a value of non-copyable type `T`
 tmp.rs:155 Foo([Zero::zero(), ..SZ])


 Any way to do this? Or is this no longer supported for general types?
 Any intentions to add this behavior again?  Otherwise, I can't even
 initialize my struct while being agnostic to the specific value of SZ.

 Ashish
 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev


 Initialising a fixed size vector [T, ..n] by [foo(), .. n] unfortunately
 requires that `T` is implicitly copyable (that is, it doesn't move ownership
 when passed by value), and there's no way around this other than [foo(),
 foo(), foo(),...].


 Huon
 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev

 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev


___
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev


Re: [rust-dev] Define copyable types for [T, ..2] static vector initialization

2013-11-29 Thread Kevin Ballard
Personally, I think it would be nicer to just have a syntax that says create 
an array of length N by executing the following expression (typically a 
function call) N times.

Something along the lines of

let ary = [Foo::new().., ..32];

This would be more generic, because it will work with non-Clonable values, and 
if you wanted cloned values you'd just say

let ary = [foo.clone().., ..32];

Although if we ever get the ability to make generics that have integral 
parameters (which is necessary to implement traits on arbitrary arrays) then we 
could do this in the libraries by writing a function like I had before. 
Something like the following:

libstd/array.rs:

#[inline]
fn from_fnT, N as uint init(f: |uint| - T) - [T, ..N] {
let mut ary: [T, ..N];
unsafe {
ary = intrinsics::uninit();
for i in range(0u, N) {
intrinsics::move_val_init(mut ary[i], f(i));
}
}
ary
}


This would let you call it like Foo(array::from_fn(|_| Zero::zero())).

-Kevin

On Nov 29, 2013, at 8:37 PM, Ashish Myles marci...@gmail.com wrote:

 That's some seriously nifty stuff, which got my stuff compiling again. :)
 
 But for the long term, it would be nice to have a syntax that behaves
 as was the case with the Copy trait -- it takes a single value and
 clones it into the elements of the static array.  Or perhaps the
 developers disagree and consider it to be a niche use (static arrays
 with sizes known a-priori when writing the code) -- it would be good
 to get some clarity on this.
 
 Thanks,
 Ashish
 
 
 On Fri, Nov 29, 2013 at 10:20 PM, Kevin Ballard ke...@sb.org wrote:
 If you're willing to use unsafe code and std::unstable, you can do it.
 
 use std::num::Zero;
 use std::unstable::intrinsics;
 
 
 enum Constants {
SZ = 2
 }
 
 struct FooT([T, ..SZ]);
 
 implT: Clone + DeepClone + Zero FooT {
pub fn new() - FooT {
let mut ary: [T, ..SZ];
unsafe {
ary = intrinsics::uninit();
for i in range(0u, SZ as uint) {
intrinsics::move_val_init(mut ary[i], Zero::zero());
}
}
Foo(ary)
}
 }
 
 -Kevin
 
 On Nov 29, 2013, at 7:05 PM, Ashish Myles marci...@gmail.com wrote:
 
 Is there a plan to support fix-sized vector initialization without manual
 replication?  My example is just a simplified version -- this was part of a
 macro that takes the size as input ($n:expr) and the initialization was
 [Zero::zero(), .. $n].  Is this use case no longer intended to be supported?
 
 On Nov 29, 2013 6:47 PM, Huon Wilson dbau...@gmail.com wrote:
 
 On 30/11/13 10:33, Ashish Myles wrote:
 
 Previously we had the Copy trait, which when implemented by trait T
 allowed one to write
 [Zero::zero(), ..SZ] where T implemented the Zero trait.  But now I am
 not sure how to get that behavior.  Concretely, here is the code I
 want to get compiling. (Just to check, I added both Clone and
 DeepClone, even though they don't automatically allow implicit
 copyability).
 
 
 use std::num::Zero;
 
 enum Constants {
 SZ = 2
 }
 
 struct FooT([T, ..SZ]);
 
 implT : Clone + DeepClone + Zero FooT {
 pub fn new() - FooT {
 Foo([Zero::zero(), ..SZ])
 }
 }
 
 
 The error I get is:
 
 error: copying a value of non-copyable type `T`
 tmp.rs:155 Foo([Zero::zero(), ..SZ])
 
 
 Any way to do this? Or is this no longer supported for general types?
 Any intentions to add this behavior again?  Otherwise, I can't even
 initialize my struct while being agnostic to the specific value of SZ.
 
 Ashish
 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev
 
 
 Initialising a fixed size vector [T, ..n] by [foo(), .. n] unfortunately
 requires that `T` is implicitly copyable (that is, it doesn't move ownership
 when passed by value), and there's no way around this other than [foo(),
 foo(), foo(),...].
 
 
 Huon
 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev
 
 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev
 
 



smime.p7s
Description: S/MIME cryptographic signature
___
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev


Re: [rust-dev] Define copyable types for [T, ..2] static vector initialization

2013-11-29 Thread Ashish Myles
+1 on specifying function. That potentially lowers the requirements on
the Traits -- e.g. don't have to force clone-ability as long as you
can create+move it; perhaps even create it in place.

I have been waiting on integer parameters on traits since I first ran
into Rust, but the rust team might be avoiding that to prevent getting
Turing complete generics/templates.

Ashish


On Sat, Nov 30, 2013 at 12:39 AM, Kevin Ballard ke...@sb.org wrote:
 Personally, I think it would be nicer to just have a syntax that says create 
 an array of length N by executing the following expression (typically a 
 function call) N times.

 Something along the lines of

 let ary = [Foo::new().., ..32];

 This would be more generic, because it will work with non-Clonable values, 
 and if you wanted cloned values you'd just say

 let ary = [foo.clone().., ..32];

 Although if we ever get the ability to make generics that have integral 
 parameters (which is necessary to implement traits on arbitrary arrays) then 
 we could do this in the libraries by writing a function like I had before. 
 Something like the following:

 libstd/array.rs:

 #[inline]
 fn from_fnT, N as uint init(f: |uint| - T) - [T, ..N] {
 let mut ary: [T, ..N];
 unsafe {
 ary = intrinsics::uninit();
 for i in range(0u, N) {
 intrinsics::move_val_init(mut ary[i], f(i));
 }
 }
 ary
 }


 This would let you call it like Foo(array::from_fn(|_| Zero::zero())).

 -Kevin

 On Nov 29, 2013, at 8:37 PM, Ashish Myles marci...@gmail.com wrote:

 That's some seriously nifty stuff, which got my stuff compiling again. :)

 But for the long term, it would be nice to have a syntax that behaves
 as was the case with the Copy trait -- it takes a single value and
 clones it into the elements of the static array.  Or perhaps the
 developers disagree and consider it to be a niche use (static arrays
 with sizes known a-priori when writing the code) -- it would be good
 to get some clarity on this.

 Thanks,
 Ashish


 On Fri, Nov 29, 2013 at 10:20 PM, Kevin Ballard ke...@sb.org wrote:
 If you're willing to use unsafe code and std::unstable, you can do it.

 use std::num::Zero;
 use std::unstable::intrinsics;


 enum Constants {
SZ = 2
 }

 struct FooT([T, ..SZ]);

 implT: Clone + DeepClone + Zero FooT {
pub fn new() - FooT {
let mut ary: [T, ..SZ];
unsafe {
ary = intrinsics::uninit();
for i in range(0u, SZ as uint) {
intrinsics::move_val_init(mut ary[i], Zero::zero());
}
}
Foo(ary)
}
 }

 -Kevin

 On Nov 29, 2013, at 7:05 PM, Ashish Myles marci...@gmail.com wrote:

 Is there a plan to support fix-sized vector initialization without manual
 replication?  My example is just a simplified version -- this was part of a
 macro that takes the size as input ($n:expr) and the initialization was
 [Zero::zero(), .. $n].  Is this use case no longer intended to be supported?

 On Nov 29, 2013 6:47 PM, Huon Wilson dbau...@gmail.com wrote:

 On 30/11/13 10:33, Ashish Myles wrote:

 Previously we had the Copy trait, which when implemented by trait T
 allowed one to write
 [Zero::zero(), ..SZ] where T implemented the Zero trait.  But now I am
 not sure how to get that behavior.  Concretely, here is the code I
 want to get compiling. (Just to check, I added both Clone and
 DeepClone, even though they don't automatically allow implicit
 copyability).

 
 use std::num::Zero;

 enum Constants {
 SZ = 2
 }

 struct FooT([T, ..SZ]);

 implT : Clone + DeepClone + Zero FooT {
 pub fn new() - FooT {
 Foo([Zero::zero(), ..SZ])
 }
 }
 

 The error I get is:

 error: copying a value of non-copyable type `T`
 tmp.rs:155 Foo([Zero::zero(), ..SZ])


 Any way to do this? Or is this no longer supported for general types?
 Any intentions to add this behavior again?  Otherwise, I can't even
 initialize my struct while being agnostic to the specific value of SZ.

 Ashish
 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev


 Initialising a fixed size vector [T, ..n] by [foo(), .. n] unfortunately
 requires that `T` is implicitly copyable (that is, it doesn't move 
 ownership
 when passed by value), and there's no way around this other than [foo(),
 foo(), foo(),...].


 Huon
 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev

 ___
 Rust-dev mailing list
 Rust-dev@mozilla.org
 https://mail.mozilla.org/listinfo/rust-dev



___
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev