> On Oct 26, 2017, at 10:27 PM, Howard Lovatt <[email protected]> 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 <[email protected] 
> <mailto:[email protected]>> wrote:
> 
> 
>> On Oct 26, 2017, at 9:52 PM, Howard Lovatt <[email protected] 
>> <mailto:[email protected]>> 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 <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> 
>>> On Oct 26, 2017, at 4:45 PM, Howard Lovatt via swift-evolution 
>>> <[email protected] <mailto:[email protected]>> 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
>> 
> 
> 

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to