On Dec 21, 2015, at 2:26 PM, Alexander Regueiro <[email protected]> wrote:
> Thanks for clarifying.
>
> In that case, I would propose grammar for capture expressions, which should
> drop in without modifications elsewhere (I say tentatively):
>
> closure-expression → “func" closure-signature_opt { statements }
If you dig through (very early) history you’ll see that we had this. There are
a couple of problems with it:
1) It punishes simple cases like “X.sort { $1 < $0 }”, along with lots of
simple map and filter closures.
2) It reads really weird in trailing closure cases.
Lets step back: What problems are you trying to solve with the current closure
syntax?
-Chris
> closure-signature → parameter-clause function-result_opt
> closure-signature → identifier-list function-result_opt
> closure-signature → capture-list parameter-clause function-result_opt
> closure-signature → capture-list identifier-list function-result_opt
> closure-signature → capture-list
> capture-list → [ capture-list-items ]
> capture-list-items → capture-list-item | capture-list-item ,
> capture-list-items
> capture-list-item → capture-specifier_opt expression
> capture-specifier → weak | unowned | unowned(safe) | unowned(unsafe)
>
> I am open to whether the introducing keyword is “func” (overloading the
> existing keyword but in an evidently separate context, and unambiguously I
> believe) – or “lambda” (like Python), or “\” (like Haskell) – or even
> something like “cl” (for Closure). Note that the aforementioned adds an
> additional keyword, but also removes the the “in” keyword. For reasons
> mentioned in my previous message, I believe this syntax is both clearer and
> more consistent. It’s also more in line with other widespread languages (in
> my experience).
>
> For reference, the current grammar is:
>
> closure-expression → { closure-signature_opt statements }
> closure-signature → parameter-clause function-result_opt “in"
> closure-signature → identifier-list function-result_opt “in"
> closure-signature → capture-list parameter-clause function-result_opt “in"
> closure-signature → capture-list identifier-list function-result_opt "in"
> closure-signature → capture-list “in"
> capture-list → [ capture-list-items ]
> capture-list-items → capture-list-item | capture-list-item ,
> capture-list-items
> capture-list-item → capture-specifier_opt expression
> capture-specifier → weak | unowned | unowned(safe) | unowned(unsafe)
>
> Also, I didn’t bother making braces optional, since I hear that the original
> language designers wanted to avoid the problems that optional braces have the
> potential to introduce (e.g. in C-style languages). There are no round
> brackets used in my above syntax either, which is consistent with their
> absence in expressions in conditional and loop statements.
>
> Thoughts?
>
>> On 21 Dec 2015, at 21:47, Chris Lattner <[email protected]> wrote:
>>
>>
>>> On Dec 21, 2015, at 1:33 PM, Alexander Regueiro <[email protected]> wrote:
>>>
>>> Hi Chris,
>>>
>>> Don’t you think the suggestion is better? I’m happy to formula it in terms
>>> of an E(BNF) grammar if you like. Is this published/available anywhere, for
>>> the current version of Swift?
>>
>> My personal opinion is “no”, because it will look very weird in trailing
>> closure, in the argument lists for function calls, etc.
>>
>> Further, it would not permit dropping ()’s on closure arguments, you
>> wouldn’t be able to write this:
>>
>> foo({ lhs, rhs in … })
>>
>> because the comma would be exposed out to the function call.
>>
>> The grammar is described in the reference section of TSPL:
>> https://swift.org/documentation/
>>
>> In addition to proposing EBNF, please consider the existing grammar so that
>> the new proposal isn’t completely ambiguous. What you are proposing would
>> be an extremely tricky thing to do.
>>
>> -Chris
>>
>>
>>>
>>> Thanks.
>>>
>>>> On 21 Dec 2015, at 19:22, Chris Lattner <[email protected]> wrote:
>>>>
>>>>>
>>>>> On Dec 21, 2015, at 11:20 AM, Alexander Regueiro via swift-evolution
>>>>> <[email protected]> wrote:
>>>>>
>>>>> Does anyone not like the current syntax for this?
>>>>>
>>>>> I would propose changing it from:
>>>>>
>>>>> { (param_list) -> return_type in … }
>>>>>
>>>>> to something cleaner like:
>>>>>
>>>>> (param_list) -> return_type => { … }
>>>>>
>>>>> where I’m not so bothered about the `=>` separator (could be `:`, `,`, or
>>>>> indeed `in`).
>>>>>
>>>>> The braces being around the type specifier as well as function body
>>>>> rather bothers me. Surely it would be more consistent just to have the
>>>>> braces around the function body, and then the type specifier preceding
>>>>> this?
>>>>
>>>> Hi Alexander,
>>>>
>>>> We’re open in principle to replacing closure syntax with something better,
>>>> but A) it needs to be actually better, and B) it needs to fit with the
>>>> swift grammar. If you’re interested in pushing forward in this area,
>>>> please familiarize yourself with the structure of the grammar and propose
>>>> what you’re thinking in terms of a diff to it. Thanks,
>>>>
>>>> -Chris
>>>
>>
>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution