> On Oct 26, 2017, at 5:12 PM, David Sweeris via swift-dev 
> <swift-dev@swift.org> wrote:
> 
> 
>> On Oct 26, 2017, at 2:57 PM, Greg Parker via swift-dev <swift-dev@swift.org 
>> <mailto:swift-dev@swift.org>> wrote:
>> 
>>> 
>>> On Oct 26, 2017, at 11:47 AM, Xiaodi Wu via swift-dev <swift-dev@swift.org 
>>> <mailto:swift-dev@swift.org>> wrote:
>>> 
>>> On Thu, Oct 26, 2017 at 1:30 PM, Jonathan Hull <jh...@gbis.com 
>>> <mailto:jh...@gbis.com>> wrote:
>>> Now you are just being rude. We all want Swift to be awesome… let’s try to 
>>> keep things civil.
>>> 
>>> Sorry if my reply came across that way! That wasn't at all the intention. I 
>>> really mean to ask you those questions and am interested in the answers:
>>> 
>>> Unless I misunderstand, you're arguing that your proposal is superior to 
>>> Rust's design because of a new operator that returns `Bool?` instead of 
>>> `Bool`; if so, how is it that you haven't reproduced Rust's design problem, 
>>> only with the additional syntax involved in unwrapping the result?
>>> 
>>> And if, as I understand, your argument is that your design is superior to 
>>> Rust's *because* it requires unwrapping, then isn't the extent to which 
>>> people will avoid using the protocol unintentionally also equally and 
>>> unavoidably the same extent to which it makes Numeric more cumbersome?
>>> 
>>> You said it was impossible, so I gave you a very quick example showing that 
>>> the current behavior was still possible.  I wasn’t recommending that 
>>> everyone should only ever use that example for all things.
>>> 
>>> For FloatingPoint, ‘(a &== b) == true’ would mimic the current behavior 
>>> (bugs and all). It may not hold for all types.
>>> 
>>> No, the question was how it would be possible to have these guarantees hold 
>>> for `Numeric`, not merely for `FloatingPoint`, as the purpose is to use 
>>> `Numeric` for generic algorithms. This requires additional semantic 
>>> guarantees on what you propose to call `&==`.
>> 
>> Would something like this work?
>> 
>> Numeric.== -> Bool 
>> traps on NaN etc.
>> 
>> Numeric.==? -> Bool? 
>> returns nil on NaN etc. You likely don't want this unless you know something 
>> about floating-point.
>> 
>> Numeric.&== -> Bool
>> is IEEE equality. You should not use this unless you are a floating-point 
>> expert.
>> 
>> The experts can get high performance or sophisticated numeric behavior. The 
>> rest of us who naïvely use == get a relatively foolproof floating-point 
>> model. (There is no difference among these three operators for fixed-size 
>> integers, of course.)
>> 
>> This is analogous to what Swift does with integer overflow. I would further 
>> argue the other Numeric operators like + should be extended to the same 
>> triple of trap or optional or just-do-it. We already have two of those three 
>> operators for integer addition after all.
>> 
>> Numeric.+ -> T
>> traps on FP NaN and integer overflow
>> 
>> Numeric.+? -> T?
>> returns nil on FP NaN and integer overflow
>> 
>> Numeric.&+ -> T
>> performs FP IEEE addition and integer wraparound
> 
> Works for me (although I'd prefer it if we could we stick to one side for the 
> "modifier" symbols -- either "&+" and  "?+", or "+&" and "+?", and likewise 
> for "==" and its variants)

At a glance this looks like a reasonable solution to me as well.

> Should `Numeric` have extensions that define the variants in terms of `==`, 
> so that authors of custom types don't have to think about it if they don't 
> want to?

Probably not.  In this design `==` is allowed to have a precondition while the 
variants are not.

> 
> - Dave Sweeris
> _______________________________________________
> swift-dev mailing list
> swift-dev@swift.org
> https://lists.swift.org/mailman/listinfo/swift-dev

_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to