I wonder if Rust could do something along the lines of F# computation expressions <http://msdn.microsoft.com/en-us/library/dd233182.aspx> (or Haskell's do-notation, if one is so inclined). This approach would put more strain on the optimizer, which would have to deal with all those lambda functions, but on the plus side, this is a more general approach, and we could get both generators and asyncs out of it in one swoop. Hmm, come to think about it, couldn't this be done with a syntax extension?
Vadim On Sun, Aug 11, 2013 at 11:53 AM, Michael Woerister < michaelwoeris...@gmail.com> wrote: > Hi, > >> [...] The reason I'm bringing this up is because in case Rust ever wants >> to gain support for bidirectional generators it should from the very start >> have something like a "yield from" to not break the reverse forwarding. >> > Thanks for the extensive explanation. These iterators with bi-directional > communication seem to be similar to what Ruby does (as described in the > last section of my blog article). > I'll have to think more about implications of and use cases for this kind > of functionality. It would not be compatible with the current std::Iterator > trait though. And it may encourage writing hard-to-read code/control flow. > Though this is just a guess. Maybe its actually easier to read and follow > than the struct-with-methods equivalent. > > I think Rust has an advantage over Python here, in that for every >>> function the return type is explicitly declared. So, if a function >>> returns an Iterator<T> (or better), one does not have to care about >>> whether the function is implemented via 'yield' or if it returns a >>> handwritten iterator. >>> >> You would think, neither do you in Python. The problem is actually not >> so much the consuming of the function but the writing of it. In a regular >> function you have execution as the function is called. In a generator >> function the execution immediately suspends until you call next(). It's >> very confusing for beginners and has caused in many, many broken WSGI >> applications in Python (WSGI is the Python web abstraction protocol that >> uses iterators). >> > Yes, it would certainly be more clear to not declare iterator fns as > regular functions (because they aren't :) > Though (IMO), it works rather well in C#. I don't have a strong opinion on > the subject. > > Even more than that, how do you make an empty generator? [...] >> > I'd say, this should be a library function, something like > `Iterator<T>::empty()`. > With the `yield break` command from C# you could also have one canonical > version: > > fn empty() -> Iterator<T> { > yield break; > } > > Lastly, in Python 3 we now are getting async IO support through >> generators and the frameworks do weird things to make generator and regular >> functions decorated with the same decorator, behave similarly in case >> someone deletes the last 'yield' from the function. An explicit 'yield fn' >> outside of the function solves this case, where a function degrades to not >> having any yield expressions any more. >> >> Yes, in theory you could make a function that returns nil but is declared >> as returning an iterator, just return the empty iterator for that type, but >> that seems wrong. >> > I think I know too little about this topic say something useful here. But > it seems like a specific library design issue. > > -Michael > ______________________________**_________________ > Rust-dev mailing list > Rust-dev@mozilla.org > https://mail.mozilla.org/**listinfo/rust-dev<https://mail.mozilla.org/listinfo/rust-dev> >
_______________________________________________ Rust-dev mailing list Rust-dev@mozilla.org https://mail.mozilla.org/listinfo/rust-dev