> On Dec 27, 2015, at 2:30 PM, Ethan Diamond via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> I realize this is on the commonly rejected list, but I really find closure 
> syntax to be one of the more unintuitive and unreadable parts of Swift so I'd 
> like to try to influence it. "Clarity at the point of use" is one of the main 
> stated goals of Swift, and the fact that http://goshdarnclosuresyntax.com/ 
> <http://goshdarnclosuresyntax.com/> exists shows me that it's not just me 
> that thinks the syntax could be improved. I believe that we can get very 
> close to the same results in line length and expressiveness while making the 
> language much more readable and clear.

FWIW, I think that web site exists as a continuation of the “blocks” web site.

>From your description, it sounds like you might want to try out nested 
>functions.  They have a more explicit syntax, and still provide the same 
>“closure” power as closure expressions.

-Chris

> 
> Let's start with a few use cases to illustrate what I mean when I say that 
> reading closure syntax is difficult. Most programmers scan left to right, so 
> when I see this property declaration:
> 
> var thing: Int
> 
> My brain reads that as a property of a class that's an integer. Unless of 
> course there's this:
> 
> var thing: Int -> Int
> 
> Boom, context switch. If you've read "Int" than any following syntax should 
> be a modifier on Int. For example, Int? works great, because in my head it's 
> still an Integer, just an optional form of that Integer. While it's not a 
> huge change in that example, lets take a more complicated one:
> 
> var thing: (String -> (), Int, (Int, Int) -> Bool)) -> Bool
> 
> Reading that left to right requires all sorts of context switching in my 
> brain. I can't even tell at first glance how many params are in that closure. 
> Reading left to right, you read "First parameter, string, no wait, closure 
> that takes string, and returns void. Second param, Int. Third param, tuple 
> with two ints, no wait, closure that takes two ints and returns bool." I just 
> doesn't have much clarity.
> 
> I believe it's already been proposed, but I don't feel there's a strong 
> enough difference between a closure and a function to justify a different 
> syntax. Let's replace my examples above with anonymous function syntax.
> 
> var thing: func (Int) -> Int
> 
> Reading left to right, it reads the way that I think about it "A function 
> that takes an integer and returns an integer."
> 
> var thing: func(func (String), Int, func (Int, Int) -> Bool) -> Bool
> 
> Again, reading left to right this is a win. "Thing is an anonymous function. 
> First param, a function that takes a string. Second param, Int. Third param, 
> a function that takes two ints and returns bool." It reads like people think.
> 
> Another strength is it lets us both use the same syntax for closures as we 
> would expect, while letting us use just about all of the same shorthands we 
> gain with closures. We could call normally like this, with the return type 
> implied when async is called:
> 
> func async(callback: func (Bool) -> Bool))
> 
> async(func (successful: Bool) {
>    return !successful
> });
> 
> We could still permit this:
> 
> func async(callback: func ())
> 
> async {
>   //Do callback stuff here
> }
> 
> We could still permit this:
> 
> func sort(sortfunc: func(Int, Int) -> Bool)
> 
> sort {
>   $0 > $1
> }
> 
> We could add this:
> 
> let greaterThan: func (number: Int) -> Bool = {
>    number > 5
> }
> 
> There would also be a few small wins, such as no longer needing "()" to 
> represent a void return, since any function without a return type would imply 
> a void return.
> 
> I understand that a big part of the decision for current closure syntax is to 
> help the compiler, but I believe by doing so you're going against the main 
> principles you laid out in your api design guidelines 
> (https://swift.org/documentation/api-design-guidelines.html 
> <https://swift.org/documentation/api-design-guidelines.html>). Current 
> closure syntax is not clear and breaks precedent of all other function like 
> declarations having the parameters listed outside of the curly braces.
> 
> Thanks for listening, and great job on Swift so far.
>  _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to