The idea is that the writer of the function is the one who can decide whether 
or not the result of their function can be safely ignored. Imagine you wrote a 
function in Swift:

func times(x: Int, y: Int) -> Int {
    return x * y;
}

At the point of writing this function (though it may be a trivial example), you 
know that any code which ignores the return value is doing something wrong. 
OTOH, in the case of a method like pop(), you might have:

func pop() -> T {
    let tmp: T = stack[top]
    top -= 1
    return tmp
}

Here, the writer of this method knows that sometimes the method may be called 
without needing to use the return value. The only case in which a return value 
might need to be ignored is in a function or method which has some sort of side 
effect. The writer of the function knows whether or not a side effect exists, 
so it is safe to allow them to annotate whether or not a return value can be 
ignored.

FKL

> On Dec 19, 2015, at 3:04 AM, Kenny Leung via swift-evolution 
> <[email protected]> wrote:
> 
> Hi All.
> 
> Being naive here (also very difficult to say this clearly and succinctly), 
> but why is this the choice of the writer of the function rather than the 
> person using the function? 
> 
> That is, I would think that if I were worried about unused return results in 
> my code, I would have some kind of flag on the client side, and not on the 
> provider side.
> 
> Does this question make any sense?
> 
> -Kenny
> 
> 
>> On Dec 10, 2015, at 2:58 PM, Adrian Kashivskyy via swift-evolution 
>> <[email protected]> wrote:
>> 
>> I think non-void functions should warn about their return value being unused 
>> by default, thus eliminating the need to attribute them with 
>> @warn_unused_result.
>> 
>> Motivation
>> 
>> It is a rare case for a result of a function to be unused – and most often 
>> it's caused by programmer having too little knowledge of the API. This, in 
>> my opinion, is a reasonable area of improvement for the compiler.
>> 
>> I also noticed that many of stdlib's functions are marked with this 
>> attribute, which supports my point of this being the default behavior.
>> 
>> Example code
>> 
>> The following should be default behavior:
>> 
>>> func square(x: Int) -> Int { return x * x }
>>> square(2) // warning: result of call to 'square' unused
>> 
>> Currently, unless annotated by @warn_unused_result, the compiler will not 
>> trigger any warnings.
>> 
>> Supporting old behavior
>> 
>> If, sometimes, it is okay to not use the result, an opposite 
>> @suppress_unused_result attribute could be used instead.
>> 
>>> @suppress_unused_result func square(x: Int) -> Int { return x * x }
>>> square(2) // no warning
>> 
>> Impact on existing code
>> 
>> The existing bare @warn_unused_result attributes will become redundant and 
>> can be easily removed by migrator. However, if an existing attribute uses 
>> message or mutable_variant argument, it may be left intact, since it 
>> provides non-obvious informational value.
>> 
>> Implementing the above proposal would definitely make the code clearer and 
>> intentional, without compromising any major use cases.
>> 
>> I would be happy to hear your thought on this.
>> 
>> 
>> Regards,
>> Adrian Kashivskyy
>> 
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected]
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to