Re: Rust-like collect in D
On Thursday, 13 October 2016 at 10:00:56 UTC, Nordlöw wrote: For instance, we can use `if (!isInfinite!Range)` to forbid collecting values from an infinite `Range`. Is this checking done? That is `0.iota.make!Array` should not be allowed. https://github.com/dlang/phobos/pull/4860
Re: Rust-like collect in D
On Wed, 2016-10-12 at 21:15 -0400, Andrei Alexandrescu via Digitalmars- d-learn wrote: > On 10/06/2016 10:32 AM, Nordlöw wrote: > > Is there a concept in D similar to Rust's `collect`: > > > > https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.colle > > ct > > That's "make" in std.container. Is that what you're looking for? As > an > aside, "collect" is an awful abbreviation of "collection". -- Andrei I's say collect has an interesting history. Smalltalk used collect for what other called map. Various languages, including Groovy, continued this tradition. Now Rust and Java are using collect as a verb-like form, just as D uses make. collection would be wrong here. -- Russel. = Dr Russel Winder t: +44 20 7585 2200 voip: sip:russel.win...@ekiga.net 41 Buckmaster Roadm: +44 7770 465 077 xmpp: rus...@winder.org.uk London SW11 1EN, UK w: www.russel.org.uk skype: russel_winder signature.asc Description: This is a digitally signed message part
Re: Rust-like collect in D
On Thu, 2016-10-13 at 02:33 +, Meta via Digitalmars-d-learn wrote: > On Thursday, 13 October 2016 at 01:15:22 UTC, Andrei Alexandrescu > wrote: > > On 10/06/2016 10:32 AM, Nordlöw wrote: > > > Is there a concept in D similar to Rust's `collect`: > > > > > > https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.col > > > lect > > > > That's "make" in std.container. Is that what you're looking > > for? As an aside, "collect" is an awful abbreviation of > > "collection". -- Andrei > > I've always thought of it more as "collect the elements of the > iterator into a container". Java and Rust have gone the same route. collect is a terminal operation creating a data structure given a potentially infinite, lazily evaluated, stream. Rust uses iter for creating a stream from a data structure, Java uses stream or parallelstream. Java's parallelstream seems to be missing from Rust, but there is Rayon to provide a version. D's std.parallelism does something of this, but it needs more work to provide the tree-structured as well as scatter–gather internal parallelism models. -- Russel. = Dr Russel Winder t: +44 20 7585 2200 voip: sip:russel.win...@ekiga.net 41 Buckmaster Roadm: +44 7770 465 077 xmpp: rus...@winder.org.uk London SW11 1EN, UK w: www.russel.org.uk skype: russel_winder signature.asc Description: This is a digitally signed message part
Re: Rust-like collect in D
On Thursday, 13 October 2016 at 01:15:22 UTC, Andrei Alexandrescu wrote: On 10/06/2016 10:32 AM, Nordlöw wrote: Is there a concept in D similar to Rust's `collect`: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect That's "make" in std.container. Is that what you're looking for? As an aside, "collect" is an awful abbreviation of "collection". -- Andrei I've always thought of it more as "collect the elements of the iterator into a container".
Re: Rust-like collect in D
On 10/06/2016 10:32 AM, Nordlöw wrote: Is there a concept in D similar to Rust's `collect`: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect That's "make" in std.container. Is that what you're looking for? As an aside, "collect" is an awful abbreviation of "collection". -- Andrei
Re: Rust-like collect in D
On 10/06/2016 07:44 PM, ag0aep6g wrote: https://dlang.org/phobos/std_container_util.html#.make More specifically, the second overload is where it's at: https://dlang.org/phobos/std_container_util.html#.make.2
Re: Rust-like collect in D
On 10/06/2016 04:32 PM, Nordlöw wrote: Is there a concept in D similar to Rust's `collect`: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect If not, I'm eager to implement it to support D-style containers. What would the desired interface look like? Perhaps: 0.iota(n).collect!Array Or can/should we just overload `std.conv.to` as 0.iota(n).to!Array eventhough the element type is not explicit in the expression `to.!Array`? https://dlang.org/phobos/std_container_util.html#.make import std.container.array: Array; import std.container.util: make; import std.range: iota; void main() { auto arr = 0.iota(99).make!Array; }
Re: Rust-like collect in D
On Thursday, 6 October 2016 at 17:22:10 UTC, Dicebot wrote: On Thursday, 6 October 2016 at 16:56:26 UTC, Nordlöw wrote: Is there a way to do this, or do we need something similar to `collect` in Phobos? Something like import std.container.array : Array; 0.iota(n).collect!Array You mean semantics like this? Container collect(Container, Range) (Range r) if(isOutputRange!Container) { Container container; r.copy(container); return container; } Yes, along with inference of element type of the container.
Re: Rust-like collect in D
On Thursday, 6 October 2016 at 16:56:26 UTC, Nordlöw wrote: Is there a way to do this, or do we need something similar to `collect` in Phobos? Something like import std.container.array : Array; 0.iota(n).collect!Array You mean semantics like this? Container collect(Container, Range) (Range r) if(isOutputRange!Container) { Container container; r.copy(container); return container; }
Re: Rust-like collect in D
On Thursday, October 06, 2016 16:56:26 Nordlöw via Digitalmars-d-learn wrote: > On Thursday, 6 October 2016 at 16:14:33 UTC, Dicebot wrote: > > If an entity (i.e. container) implements OutputRange API, you > > can already do it: > > > > 0.iota(n).copy(container); > > Ahh, not quite what I wanted... I want to mimic the functional > style Rust provides, where the `container` is constructed inline > and does not have to be declared separately. Is there a way to do > this, or do we need something similar to `collect` in Phobos? > Something like > > import std.container.array : Array; > > 0.iota(n).collect!Array That makes it sound like you just need the container to have a constructor that takes a range - either that or a helper function which constructs the container from a range (e.g. std.container.rbTree.redBlackTree is a helper function for constructing a RedBlackTree from a range). - Jonathan M Davis
Re: Rust-like collect in D
On Thursday, 6 October 2016 at 16:14:33 UTC, Dicebot wrote: If an entity (i.e. container) implements OutputRange API, you can already do it: 0.iota(n).copy(container); Ahh, not quite what I wanted... I want to mimic the functional style Rust provides, where the `container` is constructed inline and does not have to be declared separately. Is there a way to do this, or do we need something similar to `collect` in Phobos? Something like import std.container.array : Array; 0.iota(n).collect!Array
Re: Rust-like collect in D
On Thursday, 6 October 2016 at 16:14:33 UTC, Dicebot wrote: If an entity (i.e. container) implements OutputRange API, you can already do it: 0.iota(n).copy(container); Thanks, that's what I was looking for.
Re: Rust-like collect in D
On Thursday, 6 October 2016 at 14:32:44 UTC, Nordlöw wrote: Is there a concept in D similar to Rust's `collect`: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect If not, I'm eager to implement it to support D-style containers. What would the desired interface look like? Perhaps: 0.iota(n).collect!Array Or can/should we just overload `std.conv.to` as 0.iota(n).to!Array eventhough the element type is not explicit in the expression `to.!Array`? If an entity (i.e. container) implements OutputRange API, you can already do it: 0.iota(n).copy(container);
Re: Rust-like collect in D
On Thursday, 6 October 2016 at 14:58:34 UTC, Nordlöw wrote: On Thursday, 6 October 2016 at 14:33:59 UTC, rikki cattermole wrote: So an input range to array? Sure std.array : array. No, we want a generic alternative that fills any kind of container, typically non-GC allocated. Sounds like what output ranges are here for.
Re: Rust-like collect in D
On Thursday, 6 October 2016 at 14:33:59 UTC, rikki cattermole wrote: So an input range to array? Sure std.array : array. No, we want a generic alternative that fills any kind of container, typically non-GC allocated.
Re: Rust-like collect in D
On 07/10/2016 3:32 AM, Nordlöw wrote: Is there a concept in D similar to Rust's `collect`: https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect If not, I'm eager to implement it to support D-style containers. What would the desired interface look like? Perhaps: 0.iota(n).collect!Array Or can/should we just overload `std.conv.to` as 0.iota(n).to!Array eventhough the element type is not explicit in the expression `to.!Array`? So an input range to array? Sure std.array : array.