I find `do` syntax form is vital for DSL-ish code. Getting rid of it makes a lot of code look downright ugly. I'd rather it used a more Ruby-ish notation though, I find that putting the `do` far away from the `{ ... }` doesn't read well. `foo(....) do |...| { ... }` would have made more sense for me (think of `do` as a macro-ish binary operation injecting the proc into the function on the left). But the current form is acceptable.
Syntax niceties aside, I find it extremely problematic that we have only two forms of "callable", one that is on the stack but can be called multiple times, and one that is on the heap and can only be called once. This arrangement sort-of-makes-sense when one thinks from an implementation point of view, but I find it to lack a crucial use case, that of a form that is on the stack and is also called only once. The reason this 3rd form is so important is the extremely common case of a container that wants to take an action as a parameter for a method. ``` ... some_non_sendable_variable ... ... some_owned_variable ... do container.do_something_at_most_once |...| { ... use *both* variables ... } ``` This is a lose-lose situation. If the container takes a `proc`, then Rust complains that it can't capture the non-send-able variable. But if the container takes a stack closure, then Rust complains it can't use the owned variable. Of course, the container will _not_ send the action and will also _not_ call it twice, but it can't express this in the action type :-) The only workaround I found is to use a closure and wrap each and every non-send-able variable in a cell - this is an pointless and downright annoying manual boilerplate code. As long as this area of the language is being changed, I think that adding this missing 3rd variant should definitely be discussed (and hopefully implemented). This would affect the syntax discussion because there would be three forms instead of two; there are some more and less obvious choices here but they are secondary to the core issue of allowing the 3rd variant in the 1st place. On Sat, Nov 30, 2013 at 9:02 AM, Chris Morgan <m...@chrismorgan.info> wrote: > (a) Kill ``do`` > ... > (b) Make ``do`` support both closures and procedures > ...
_______________________________________________ Rust-dev mailing list Rust-dev@mozilla.org https://mail.mozilla.org/listinfo/rust-dev