[swift-evolution] Making capturing semantics of local
Johannes Weiß
johannesweiss at apple.com
Fri Oct 27 11:52:54 CDT 2017
> On 27 Oct 2017, at 6:27 am, Howard Lovatt via swift-evolution <swift-evolution at swift.org> 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.
>
> 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
sorry, offtopic to the thread but that you can have easier with the fixed-point combinator (https://en.wikipedia.org/wiki/Fixed-point_combinator)
// the fixed-point combinator
func fix<T>(_ f: @escaping ((@escaping (T) -> T) -> (T) -> T)) -> (T) -> T {
return { (x: T) in (f(fix(f)))(x) }
}
// demo
let fact = fix { fact_ in { n in n == 1 ? 1 : n * fact_(n-1) } }
for i in 1..<10 {
print(fact(i))
}
-- Johannes
>
> -- Howard.
>
> On 27 October 2017 at 15:53, Slava Pestov <spestov at apple.com> wrote:
>
>
>> On Oct 26, 2017, at 9:52 PM, Howard Lovatt <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> wrote:
>>
>>
>>> On Oct 26, 2017, at 4:45 PM, Howard Lovatt via swift-evolution <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
>>
>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
More information about the swift-evolution
mailing list