[swift-evolution] Making capturing semantics of local

Slava Pestov spestov at apple.com
Fri Oct 27 00:31:26 CDT 2017



> On Oct 26, 2017, at 10:27 PM, Howard Lovatt <howard.lovatt at gmail.com> wrote:
> 
> > Closures cannot replace all uses of local functions. Local functions can be recursive, and have a generic parameter list.
> 
> My response would be add these featurtes to closures, it will make closures better.

Since closures are first class values, giving closures the ability to define their own generic parameters means the type system would now need to support higher-rank polymorphism. This is a complex feature...

> 
> In terms of recursion you can fiddle it:
> 
> struct RecursiveClosure<C> {
>     var c: C! = nil
> }
> func factorial(_ n: Int) -> Int {
>     var recursive = RecursiveClosure<(Int) -> Int>()
>     recursive.c = { x in
>         (x == 0) ? 1 : x * recursive.c(x - 1)
>     }
>     return recursive.c(n)
> }
> factorial(5) // 120

Sure, this is just the Scheme letrec-to-let transform done by hand. But at this point, it’s clearly worse than defining a local function, even more so if you have multiple mutually recursive local functions.

Slava

> 
>   -- Howard.
> 
> On 27 October 2017 at 15:53, Slava Pestov <spestov at apple.com <mailto:spestov at apple.com>> wrote:
> 
> 
>> On Oct 26, 2017, at 9:52 PM, Howard Lovatt <howard.lovatt at gmail.com <mailto:howard.lovatt at gmail.com>> wrote:
>> 
>> It would be easy to provide a fixit.
> 
> That is still a source breaking change that requires migration, though.
> 
>> How often are they actually used? I rarely use them and all my use cases could be a closure instead. 
>> 
>> Also see Mike Kluev example; local functions are arguably worse than closures in all cases (provided that you can appropriately annotate the function type).
> 
> Closures cannot replace all uses of local functions. Local functions can be recursive, and have a generic parameter list.
> 
> Slava
> 
>> 
>>   -- Howard.
>> 
>> On 27 October 2017 at 12:26, Slava Pestov <spestov at apple.com <mailto:spestov at apple.com>> wrote:
>> 
>> 
>>> On Oct 26, 2017, at 4:45 PM, Howard Lovatt via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>> 
>>> Rather than expand local function syntax why not deprecate local functions completely
>> 
>> I don’t think at this point such a drastic change to the language is likely to happen.
>> 
>> Slava
>> 
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20171026/750494fb/attachment.html>


More information about the swift-evolution mailing list