> On Nov 8, 2017, at 1:20 PM, Kevin Ballard <[email protected]> wrote:
>
> On Tue, Nov 7, 2017, at 09:37 PM, John McCall wrote:
>>
>>> On Nov 7, 2017, at 6:34 PM, Kevin Ballard via swift-evolution
>>> <[email protected] <mailto:[email protected]>> wrote:
>>>
>>> On Tue, Nov 7, 2017, at 03:23 PM, John McCall via swift-evolution wrote:
>>>> https://github.com/apple/swift-evolution/blob/master/proposals/0187-introduce-filtermap.md
>>>>
>>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0187-introduce-filtermap.md>
>>>>
>>>> • What is your evaluation of the proposal?
>>>
>>> This proposal is going to cause an insane amount of code churn. The
>>> proposal suggests this overload of flatMap is used "in certain
>>> circumstances", but in my experience it's more like 99% of all flatMaps on
>>> sequences are to deal with optionals, not to flatten nested sequences.
>>>
>>>> • Is the problem being addressed significant enough to warrant a change to
>>>> Swift?
>>>
>>> I don't think so. It's a fairly minor issue, one that really only affects
>>> new Swift programmers anyway rather than all users, and it will cause far
>>> too much code churn to be worthwhile.
>>>
>>> I'd much rather see a proposal to add a new @available type, something like
>>> 'warning', that lets you attach an arbitrary warning message to a call
>>> (which you can kind of do with 'deprecated' except that makes the warning
>>> message claim the API is deprecated).
>>
>> As review manager, I generally try to avoid commenting on threads, but I
>> find this point interesting in a way that, if you don't mind, I'd like to
>> explore.
>>
>> Would this attribute not be a form of deprecation? Certainly it acts to
>> discourage current and subsequent use, since every such use will evoke a
>> warning.
>>
>> Is the word "deprecation" just too strong? Often we think of deprecated
>> APIs as being ones with more functional problems, like an inability to
>> report errors, or semantics that must have seemed like a good idea at the
>> time. Here it's just that the API has a name we don't like, and perhaps
>> "deprecation" feels unnecessarily judgmental.
>
> What I'm suggesting is that we don't change the API name at all. That's why I
> don't want to use 'deprecated', because we're not actually deprecating
> something. I'm just suggesting an alternative way of flagging cases where the
> user tries to use flatMap but accidentally invokes optional hoisting, and
> that's by making a new overload of flatMap that works for non-optional
> (non-sequence) values and warns the user that what they're doing is better
> done as a map. Using the 'deprecated' attribute for this would be confusing
> because it would make it sound like flatMap itself is deprecated when it's
> not.
I see. Thanks.
John.
>
>> Also, more practically, it conflates a relatively unimportant suggestion —
>> that we should call the new method in order to make our code clearer — with
>> a more serious one — that we should revise our code to stop using a
>> problematic API. Yes, the rename has a fix-it, but still: to the extent
>> that these things demand limited attention from the programmer, that
>> attention should clearly be focused on the latter set of problems. Perhaps
>> that sense of severity is something that an IDE should take into
>> consideration when reporting problems.
>>
>> What else would you have in mind for this warning?
>
> The main use for this warning would be for adding overloads to methods that
> take optionals in order to catch the cases where people invoke optional
> hoisting, so we can tell them that there's a better way to handle it if they
> don't have an optional. flatMap vs map is the obvious example, but I'm sure
> there are other cases where we can do this too.
>
> But there are also other once-off uses. For example, in the past I've written
> a function that should only ever be used for debugging, so I marked it as
> deprecated with a message saying 'remove this before committing your code'.
> This warning would have been better done using the new 'warning' attribute
> instead of as a deprecation notice.
>
> -Kevin Ballard
>
>> John.
>>
>>> With that sort of thing we could then declare
>>>
>>> extension Sequence {
>>> @available(*, warning: "Use map instead")
>>> func flatMap<U>(_ f: (Element) -> U) -> [U] {
>>> return map(f)
>>> }
>>> }
>>>
>>> And now if someone writes flatMap in a way that invokes optional hoisting,
>>> it'll match this overload instead and warn them.
>>>
>>>> • How much effort did you put into your review? A glance, a quick reading,
>>>> or an in-depth study?
>>>
>>> A quick reading, and a couple of minutes testing overload behavior with
>>> availability attributes (to confirm that we can't simply use 'unavailable'
>>> for this).
>>>
>>> -Kevin Ballard
>>>
>>> _______________________________________________
>>> swift-evolution mailing list
>>> [email protected] <mailto:[email protected]>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution