> On Apr 14, 2016, at 10:50 PM, Chris Lattner <clatt...@apple.com> wrote:
> On Apr 14, 2016, at 10:40 PM, John McCall <rjmcc...@apple.com> wrote:
>>>> To me, the unparenthesized style suggests that the input and output are 
>>>> peers, which feels more natural for the sort of value-to-value 
>>>> transform/predicate where this most commonly occurs.  Parenthesizing the 
>>>> input feels fussier, which contributes to a sense that the argument is 
>>>> just one component to producing the result.
>>>> The parentheses are grammatically unnecessary in most cases (by frequency 
>>>> of use in higher-use programming, not by feature count).  
>>> 
>>> I agree with your point that many simple higher order programming examples 
>>> (e.g. map, filter, etc) take a single argument.  That said, I don’t agree 
>>> that this means that we should syntactically privilege this special case.
>> 
>> "Special case" is a loaded phrase.  Why is it a special case as a parameter 
>> if it isn't a special case as a result?
> 
> Because, as I tried to explain in my original post, parameters *are* a 
> special case.  The result type of a function is just a type.  The parameter 
> list allows things that types do not: default arguments and variadics.

Default arguments are not allowed in the type grammar.  Nor are different 
internal vs. external labels.

> As a concrete example, surely you aren’t arguing that we should support:
> 
>       let x : Int… -> Int
> 
> are you?

No, but that's because the ... is a reference to the rest of the tuple and 
doesn't read correctly outside of one.

>>>> I guess the flip side is that call and declaration syntax both require 
>>>> parentheses (unless the only argument is a trailing closure), but again, 
>>>> we had strong justifications for that: declarations would always be 
>>>> ambiguous without parens, and calls would have serious problems (and the 
>>>> style-wars factor would be much larger, especially now with mandatory 
>>>> keyword arguments by default).
>>> 
>>> Right, but regardless of *why* we always require parens on Decls and 
>>> ApplyExprs, we really do (and that isn’t going to change).  Being 
>>> consistent between func decls and function types is quite important IMO.
>> 
>> So we should require function argument labels in function types?
> 
> Uhm, yes, we already do.  In:
> 
>       let x : (a : Int) -> Float
>       let y : (Int) -> Float
>       let z : Int -> Float
> 
> x and y have different (but compatible) types. y and z have identical types 
> (sugared differently).

When I said "function type", I was referring to this production in the type 
grammar, not the type signature component of function declarations.  I'm not 
sure how I could've been clearer on that without actually using the names of 
grammatical productions.

My point was that allowing a function type to be written as "(Int) -> Float" is 
already inconsistent with function declarations, because that is not legal 
function declaration syntax; you would have to write "(_ : Int) -> Float".

The current language composes naturally here, and your proposal feels like an 
odd extra rule.

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

Reply via email to