New for loops in Rust
brson.github.com
brson.github.com
A different concept should use different syntax -- and it looks like Rust has several new concepts where they can invent whatever syntax they want. But the same concept should use the same syntax.
NB. Since Perl 5.10 it does have continue & break in its given/when (topicalizer) switch block.
`ret` is a non-local return, it's got nothing to do with `break` (which is a local return and the usual" break).
Also, `ret` is in line with the (unfortunate I think) systematic shortening of keywords in Rust: `fn`, `ret`, `mut`, `alt`, ...
And as p4lindromica notes, Ruby's `continue` is called `next`.
But the truth is that whatever the surface syntax is, one quickly gets used to it. What's more important are the core concepts at work.
I hope there's something I've missed. I've been quite impressed by the rest of the language so far & it would be a shame if they got this wrong.
That said, perhaps there is something you've missed. I've posted links to the Rust mailing list elsewhere in this thread, could you skim over those and let me know if they address your concerns? Honestly I'm not super-thrilled at this change myself, if only because it makes for loop invocations a bit busier to look at, but I can't say that I fully understand the semantic tradeoffs here.
fn foo(f: fn()) {
log(info, "calling f");
f();
log(info, "called f");
}
fn bar() {
log(info, "calling foo");
foo({||
ret;
});
log(info, "called foo");
}
I'm not clear on whether the ret would return from foo or from bar - or whether it would be a compile error.BTW thanks for taking the time to reply - I appreciate it!
`ret` in block functionhttp://smallcultfollowing.com/babysteps/blog/2012/04/06/for-...
https://mail.mozilla.org/pipermail/rust-dev/2012-February/00...
https://mail.mozilla.org/pipermail/rust-dev/2012-March/00149...
https://github.com/mozilla/rust/issues/1619
As far as I remember it has to do with the prior inability to handle non-local returns and the desire to honor Tennent's Correspondence Principle.
Also, what is the appeal to '::' instead of just '.'
Kill the semicolons with fire
'.' is still used for object lookup which is dynamic.
Statements based on keywords are syntactic sugar. What I'm seeing here in Rust is the complete opposite, building an iteration statement from language built-ins. It does include some sugar in it (and "for" is a special keyword) but the semantics of the construct is based on lambda calculus and other lower level constructs in Rust.
In general, it's better that a language has as little special syntax that cannot be constructed from elementary blocks. The gaps are then bridged by adding a little sugar coating to make programming convenient (for humans) but keeping the core language clear and concise (for interpreters and compilers).
For example, in C, you cannot define your own loop structures and you're stuck with for, do and while (C macros are so crappy that they don't count). Haskell, on the other hand, does not have any special iteration statements in the language core but there's a handful of iteration functions that are regular functions and you are free to define your own. Same thing with Scheme (and other Lisps).
In the end this makes Rust loops look like Ruby loops. May I restate that «widely used programming languages are modified until they resemble Ruby» (https://news.ycombinator.com/item?id=3448277) or CLispScript (https://news.ycombinator.com/item?id=3448826).
What I do not understand of the late "scripting" languages (Dart, Rust) is why they don't just modify Ruby to have a stricter type system and call it done? That or just abandon the scripting mindset and go for more purely functional languages with non-C-like syntaxes like Haskell or OCaml.
With that in mind, the suggestion that it'd be more worthwhile to strap static types onto Ruby is like looking at engineers designing an aerodynamic, fuel-efficient, high-speed dragster and suggesting they stick a bigger engine in a sedan and call it done. Yes, Rust has adopted a feature superficially similar to Ruby's; that does not mean it wishes to fill the same niche or that Ruby's goals align with Rust's in any significant way.
I think you may be confusing it with something else.