Since this drifted onto named arguments:
The problem with (implicit) named arguments is that the calling site context of a value may be different than the use sure name. The poster example in Swift would probably be
func send(message: Message, from source: Actor, to target: Actor)
In this case, send(message:source:target:) would also make sense, but send(message:from:to:) (arguably) reads better. Actually, it should probably be send(:source:target:), as the fact that the first parameter is Message is in the type, and the Swift API recommendations say that you shouldn’t repeat the type as an argument name.
Though I agree that the barrier should be high to getting features into the language, I don’t agree that it isn’t already. For one, writing a good RFC is already a large hurdle to overcome. Many suggestions die a fast, quiet death because someone tossed it out here or elsewhere, but nobody was enthused enough to write up a proper RFC. Most of the recent big-ticket changes that have gone through RFC have been language (or libs) team proposals, as well; the ones that come to mind are the modules and async.
Both of these come from a position of a weakness in the language: modules because Rust never intended to be revolutionary on the module front – and the last version I heard about was quite minimal, and async because one of Rust’s goals for 2018 is to be great choice for web-connected workers, which requires good, powerful, and ergonomic asynchrony.
(If you disagree that the modules change is small, here is the four bullet point version:
- Allow crate-local paths to start with
crate::
- Allow paths to start with an external crate linked in by the rustc command line invocation (used by cargo)
- Include linked in crates in the prelude names implicitly glob imported into any namespaces
- Allow
file.rs to have submodules as if it were file/mod.rs (currently, it can’t have any)
That seems minimal, incremental, and like a simplification to me; the root module no longer is special and information in cargo doesn’t have to be repeated.)
It only feels like a lot because there is a lot of enthusiasm about Rust from the community. That enthusiasm also helps to filter the RFCs to the ones that have a decent chance of improving the language. Almost every libs RFC is immediately hit by “why not an external crate” (those that don’t because they’ve addressed it), and even many language ones as well.
I do agree that accepting RFCs faster than they can be implemented is a dangerous road. That’s why I threw my hat in the “Rust 2018 should be boring” ring. But a key part of Rust’s philosophy is that “stability without stagnation”, so new ideas will hopefully always be coming.
As a final side, it’s very easy to do “armchair” language design. I’m not free of guilt here. It’s much easier to try to get your favorite feature (for me, refutable/guard let) into an existing language than make your own (plus convincing others to use it), and Rust is by far the most accepting of any idea from an outsider to language design. While we’re still in that position of hip new language that is open to community suggestions, and especially while we’re the “best” with those qualifications (for some (conflicting) definitions of “best” by the crowd), we will attract suggestions.
It’s our job as an engaged community to encourage good, thought out discussion and design. I hope we can continue to do a good job at it.
(Apologies for the wall of text; TL;DR change is scary but we should always evaluate objectively and critically (in the good way))