> On Feb 20, 2017, at 2:56 PM, David Sweeris via swift-evolution 
> <[email protected]> wrote:
> 
>> 
>> On Feb 20, 2017, at 2:50 PM, Michel Fortin via swift-evolution 
>> <[email protected]> wrote:
>> 
>>> Le 20 févr. 2017 à 14:45, Matthew Johnson <[email protected]> a écrit :
>>> 
>>>> 
>>>> On Feb 20, 2017, at 1:42 PM, Michel Fortin <[email protected]> 
>>>> wrote:
>>>> 
>>>>> Le 20 févr. 2017 à 14:23, Charles Srstka <[email protected]> a 
>>>>> écrit :
>>>>> 
>>>>> I’m not sure how I feel about that, since it hamstrings the ability to 
>>>>> improve APIs in a lot of ways without breaking backwards compatibility. A 
>>>>> quick example off the top of my head would be all the Cocoa APIs that 
>>>>> started out having ivars representing paths backed by simple getter 
>>>>> methods, and were later refactored to be URL-based, but with the original 
>>>>> path properties become computed properties pointing to the URL’s “path” 
>>>>> property. With this, properties would not be able to be refactored in 
>>>>> this way unless the library developer had previously declared the “path” 
>>>>> property as private(set), which is unlikely for a property that was not 
>>>>> intended to be changed after the class was initialized.
>>>> 
>>>> Version 1:
>>>> 
>>>>    public class A {
>>>>            public let path: String
>>>>    }
>>>> 
>>>> Version 2:
>>>> 
>>>>    public class A {
>>>>            public pure var path: String { return url.path }
>>>>            public let path: URL
>>>>    }
>>>> 
>>>> This is assuming `let` is implicitly pure. It probably should not be. Or 
>>>> at least it should not when crossing module boundaries. Note that internal 
>>>> to the module it wouldn't violate any contract to allow pure code access 
>>>> to `let` variables.
>>>> 
>>>> Which makes me think of an idea: internal to the module, `pure` could be 
>>>> inferred for everything. Only the published APIs would require the 
>>>> annotations, and only if you want `pure` to be part of the API contract. 
>>>> Attaching `pure` to an internal function could still be useful for your 
>>>> own reasoning though.
>>> 
>>> That’s a very interesting approach that could lighten the syntactic load.  
>>> We could strategically annotate our code where we want purity verified, but 
>>> otherwise omit the annotation for members that don’t need to be visible 
>>> outside the module.  This approach works especially well for closures.  I 
>>> like it a lot!
>> 
>> There is an important limitation to this though: a class method that mutate 
>> something in the class is never going to be implicitly pure (per the rules 
>> of purity for instance methods). For that the compiler would have to prove 
>> the method is only called from unique references, and that'd be a bit weird 
>> (add a method call somewhere and suddenly the function becomes impure).
>> 
>> There's also an issue with diagnostics: say you have func1 that calls func2 
>> that calls func3. Func1 is `pure`, the other two are pure only implicitly. 
>> Then you change something in func3, and suddenly func1 complains that it 
>> can't call impure func2 and you are left wondering why because you haven't 
>> changed anything in func2. Perhaps the compiler could dig in the call tree 
>> to find the impure operation and tell you, but that's starting to look like 
>> the awful diagnostic messages for C++ templates.
> 
> Could we only infer purity for one “level”? As a technical limitation rather 
> than part of the language spec, to be removed at some later date when we have 
> time to implement the diagnostic logic? So in your example, the purity of 
> func2 or func3 could be inferred, but the other would have to be annotated.
> 
> - Dave Sweeris

It seems like there's a parallel to 'throws' here, where the unknown 
throwy-ness of a function has to be dealt with for closures with 'rethrows'. 
Pie in the sky, perhaps, but it'd be interesting to see what a generalized 
effects system would look like for Swift, ideally subsuming both of those and 
allowing for many others.

        David

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

Reply via email to