[swift-evolution] Utilizing arguments without meaningful internal names

Brent Royal-Gordon brent at architechies.com
Fri Feb 5 18:55:38 CST 2016


> e.g. Here’s an operator I use (I saw something very similar recently called “then”).
> 
> public func …<Type>(
>    _$0: Type,
>    @noescape ƒ0: Type -> ()
> ) -> Type {
>    ƒ0(_$0)
>    return _$0
> }
> 
> In the future, I’d prefer to keep the documentation the same, but have the code be this:
> 
> public let …<Type>(Type, @noescape Type -> ()) {
>    ƒ0(.0)
>    return .0
> }

Both of these examples seem strictly less readable than this:

	public func … <Value>(value: Value, accessor: @noescape Value -> ()) -> Value {
		accessor(value)
		return value
	}

They're shorter, but brevity is not a virtue if it makes your code less clear. Swift is not APL.

> 1. The distinction between immutable closures and functions should dissolve, hence “let" 

How do you handle overloading? `let` shadows, while `func` overloads.

Also, what is actually gained by eliminating the keyword marking functions as different from constants?

> 2. Trailing closures should be known by default as ƒ0, ƒ1, etc.

So, how many people know how to type ƒ? I sure don't.

> 3. $ is ugly and should be changed to .

Which already has a different meaning, looking up a static property or method on the contextually expected type.

> 4. Return type should be implicit

Eliminating the one rock—function signatures—that Swift's type inference system, which already can easily get into serious computational complexity, has to cling to.

-- 
Brent Royal-Gordon
Architechies



More information about the swift-evolution mailing list