> On Mar 30, 2016, at 4:35 PM, Ted F.A. van Gaalen <tedvgios...@gmail.com> 
> wrote:
> 
> 
>> On 30.03.2016, at 20:29, Developer <devteam.cod...@gmail.com 
>> <mailto:devteam.cod...@gmail.com>> wrote:
>> 
>> I believe section 6.3 of the ISO/C99 specification describes its integer 
>> promotion rules and Appendix J describes undefined behavior as a consequence 
>> of integer and floating point coercion.  I refer to these when I speak of 
>> "rules”.
> Although ISO compliance makes sense in a lot of cases, for programming 
> languages, 
> these rules are extremely bureaucratic, restricting and always far behind 
> fast developments in 
> IT.   Would you like to see Swift to be ISO compliant? 
> Then you could throw away perhaps more than half the language constructs
> currently present in Swift?
> 
> @Chris:  
> 
> is there a desire/requirement to make Swift ISO compliant? 
> and thus therewith restricting Swift’s flexibility? If so, to what extent? 
> 

This is orthogonal to the discussion at hand.

>> 
>> As long as data loss is an "unintended" effect of a certain class of 
>> coercions, I don't believe it deserves to be implicit.  If you "know what 
>> you're doing", the preference so far has been to tell the compiler that and 
>> use the constructors provided in the Swift Standard Library to perform 
>> explicit truncation.  Even in C, if you can be more specific with a cast in 
>> cases where you intend data loss, you probably should be.
> With all due respect, Robert, Imho, I find this all too theoretical and 
> bureaucratic and tons of unnecessary overhead. 
> and I am telling the compiler implicitly: 
> aFloat = anInt  // The compiler will use a builtin function to do the 
> conversion. what can be wrong with that? 
> Again, in the cases I mentioned there is no data loss. (precision excluded) 

An example of “data loss”, then (adapted from the wonderful example given by 
Felix Cloutier here <http://stackoverflow.com/a/2658736/945847>).  Be judicious 
running this, it will spin for quite a while if you don’t kill it first.

import Darwin

for i in Int(INT_MAX).stride(to: 0, by: -1) {
        let value : Float = Float(i)
        let ivalue : Int = Int(value)
        if (i != ivalue) {
                print("Integer \(i) is represented as \(ivalue) in a float\n")
        }
}


You may still argue, however, that loss of precision is not as egregious as 
full-on truncation, but it is still data loss all the same.  If it is too 
technical and bureaucratic to insert casts to make your intent clear in either 
language (rather than what I assume is just silencing -Wconversion), I’ll take 
bureaucracy and safety over convenience please.

~Robert Widmann

>  
>> 
>> ~Robert Widmann
>> 
>> 2016/03/30 13:57、Ted F.A. van Gaalen <tedvgios...@gmail.com 
>> <mailto:tedvgios...@gmail.com>> のメッセージ:
>> 
>>> Thank you, Robert & Haravikk
>>> Please allow me to respond in-line hereunder, thanks.
>>> Ted.
>>>> On 30.03.2016, at 16:15, Haravikk <swift-evolut...@haravikk.me 
>>>> <mailto:swift-evolut...@haravikk.me>> wrote:
>>>> 
>>>> I’m in favour of implicit conversion for integers where no data can be 
>>>> lost (UInt32 to Int64, Int32 to Int64 etc.), in fact I posted a similar 
>>>> thread a little while ago but can’t find it; there’s something being done 
>>>> with numbers so this may be partly in the works.
>>>> 
>>>> I definitely think that implicit conversion for floating point should be 
>>>> avoided, as it can’t be guaranteed
>>> Why?  and   What cannot be guaranteed? 
>>> 
>>>> except in certain edge cases; for example, Javascript actually technically 
>>>> uses a double for all of its numeric types, effectively giving it a 52-bit 
>>>> (iirc) integer type,
>>> awful, didn’t know that
>>>> so in theory conversion of Int32 to Double is fine, and Int16 to Float 
>>>> might be as well, but I’m not certain if it’s a good idea or not, as it’s 
>>>> not quite the same as just extending the value.
>>> It simply would cause a float with less precision as an integer like 
>>> 10000 -becomes e.g - 9999.999999, (depending on magnitude, of course) 
>>> but that is normal in a floating point domain; E.g.  also with: 
>>>      var v:Double  = 10000.0       //   Double to Double 
>>> 
>>> v would have the same imprecision… and could be anywhere between 
>>> 9999.9998…10000.00001  
>>> (rough estimation, depending on magnitude and the floating point type used) 
>>> 
>>>> 
>>>>> On 30 Mar 2016, at 14:57, Developer via swift-evolution 
>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>> 
>>>>> What you describe, all those cases where one fixes losing precision by 
>>>>> simply "ignoring it", that's part of why I'm hesitant about simply 
>>>>> throwing in C-like promotion rules into any language.
>>> 
>>> E.g. if I assign an Int to a Double, then I know very well what I am doing.
>>>  often occurring simple example here:
>>>     for i in 0..<10
>>>         {
>>>                 dTemperature = dInterval * i         / /   Double = Double 
>>> * Int  (not possible yet in Swift)
>>>                foo(dTemperature)  
>>>          }
>>>  
>>>       Here I still have to write:     
>>>                    dTemperature = dInterval * Double(i)       
>>> 
>>>       However, Swift will accept: 
>>>                    dTemperature = dInterval * 3        // 3 inferred to 
>>> Double. could be regarded as an implicit conversion? 
>>> 
>>>       
>>> 
>>>>>  Once you add implicit type coercions, even just between integer or 
>>>>> floating point types, your language gains a hundred unspoken rules
>>> Could you please explain these “unspoken rules” you mention more in detail? 
>>>  
>>> 
>>>>> and little guard rails you have to cling to lest you slip and hit the 
>>>>> next pitfall.
>>> I am counting on the average intelligence of programmers.
>>> 
>>>>>  Though you may be dismissive of information loss, it is a serious issue 
>>>>> in coercions, and one with implications that are never completely grokked 
>>>>> by experts
>>> In practice, the implications/effects/behavior of a programming language 
>>> cannot be fully predicted and understood, there are simply too many 
>>> possibilities, 
>>> Functional Programming attempts to solve this, trying to make/do everything 
>>> mathematically 
>>> correct but fails for the aforementioned reason.
>>> 
>>>>> and serve as yet another hindrance to novices trying to adopt the 
>>>>> language. 
>>> I don’t agree here. Even novices should have a good understanding 
>>> of the basic data types of a programming language,
>>> Also note that  concepts of integer, natural, rational, irrational numbers 
>>> etc.
>>> is very basic mathematics as learned in high school. 
>>> or your country’s equivalent education. 
>>> 
>>> 
>>> So aDouble = anInt  should -in the programmer’s mind- 
>>> appear as an explicit conversion, that is, he/she should realize the 
>>> consequences. 
>>> The same applies also doing it explicitly like so:
>>>        
>>>      aDouble = Double(anInt)    
>>> Same effect: even a fool can use this as well and not knowing the 
>>> implications.
>>> 
>>> 
>>>>> 
>>>>> So, I don't think coercion under this scheme is the complete 
>>>>> end-all-be-all solution to this problem, [though it may certainly feel 
>>>>> right].  Sure, it is always defined behavior to "downcast" a value of a 
>>>>> lower bitwidth to one of a higher bitwidth, but to dismiss Int -> Float, 
>>>>> Float -> Int,
>>> I wrote that I don’t want implicit conversion for Float -> Int. 
>>>>> and Double -> Float, etc. coercions as mere trifles is an attitude I 
>>>>> don't want enshrined in the language's type system.
>>>>> 
>>> Could you give me an example where Double -> Float is problematic (apart 
>>> from loosing precision) ? 
>>> 
>>>>> Perhaps there is a middle ground.  Say, one could declare conformance to 
>>>>> a special kind of protocol declaring safe implicit convertibility (see: 
>>>>> Idris' solution of having an `implicit` conversion mechanism).
>>> Please spare me from this kind of contraptions.
>>> 
>>>   -=side note: =-
>>> Thanks for bringing Idris to my attention. Investigating... 
>>> Idris is a FP language. I am not against it, but to me, FP is almost 
>>> unreadable.
>>> I doubt if I will ever use it.  
>>> I use strictly OOD/OOP. It’s natural. Like in Smalltalk. Proven. Solid.
>>> For now, the only reason I use protocols in Swift are to accommodate  
>>> delegating/callbacks.
>>>   -= end side note =- 
>>>  
>>> 
>>> 
>>>>> Or perhaps a good first step may be to not deal with information loss at 
>>>>> all, and only keep the parts of this proposal that are always defined 
>>>>> behavior.
>>> To me, there is no unintended information loss, because I know what I am 
>>> doing regarding implicit conversion.
>>> Then again, in all the cases for which I suggested implicit data type 
>>> conversion, there is no data loss (apart from precision)
>>> 
>>> TedvG
>>> 
>>>>> 
>>>>> ~Robert Widmann
>>>>> 
>>>>> 2016/03/30 8:01、Ted F.A. van Gaalen via swift-evolution 
>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> のメッセージ:
>>>>> 
>>>>>> Currently, one has to deal with explicit conversion between numerical 
>>>>>> types,
>>>>>> which in many cases is unnecessary and costing time to code 
>>>>>> for things that are quite obvious,
>>>>>> and cluttering the source, making it less readable.
>>>>>> 
>>>>>> Especially dealing all the time with often unavoidable intermixing 
>>>>>> of floating point types CGFloat, Float, and Double 
>>>>>> is really very annoying. 
>>>>>> 
>>>>>> Conversion beween floating point types is always harmless as 
>>>>>> floating point types are essentially the same. 
>>>>>> They differ only in precision.
>>>>>> 
>>>>>> Therefore, I would recommend allowing the following implicit type 
>>>>>> conversions:
>>>>>> 
>>>>>> -between all floating point types e.g. Double, Float, CGFloat  
>>>>>> 
>>>>>> -from any integer type to floating point types
>>>>>> 
>>>>>> -Also, personally, I wouldn’t mind assigning from a float to a (signed) 
>>>>>> integer
>>>>>> because I know what I am doing: that the fraction is lost 
>>>>>> and that assigning a too large float to an Integer would then cause 
>>>>>> a run time error, which I can try/catch, of course. 
>>>>>> 
>>>>>> -from unsigned integer to signed integer   
>>>>>> (nothing is lost here, but overflow should cause a run time error) 
>>>>>> 
>>>>>> but no implicit conversion for:
>>>>>> - from integer to unsigned integer   (loosing sign here)
>>>>>> - from a larger integer type to a smaller one e.g.   Int32 <- Int64   
>>>>>> (truncation)  
>>>>>> 
>>>>>> Note however, that the compiler should issue warnings 
>>>>>> when you do implicit conversions, but these warnings 
>>>>>> are for most programmers of the “Yeah I know, don’t bug me.”
>>>>>> type, so one should be able to switch off these type of warnings.
>>>>>> 
>>>>>> Even a programmer with little experience simply knows 
>>>>>> that bringing integers into the floating point domain 
>>>>>> causes precision loss. 
>>>>>> He/she also knows that assigning a Double to a smaller floating
>>>>>> point type also cause precision loss.  
>>>>>> the reverse is not true.
>>>>>> 
>>>>>> 
>>>>>> Very much interested in your opinion!
>>>>>> 
>>>>>> ----
>>>>>> N.B. the above does not yet include 
>>>>>> the fixed decimal numerical type as this type is not yet
>>>>>> available in Swift.  However, it should be  implemented 
>>>>>> *as soon as possible*  because the fixed decimal type 
>>>>>> is really needed for applications working with financial data!
>>>>>> E.g. 
>>>>>> var depositPromille: Decimal(10,3)
>>>>>> typealias  Money = Decimal(20,2) 
>>>>>>   
>>>>>> For more info on how this could be implemented
>>>>>> in Swift. please read a PL/1 manual, ( i grew up in this world)
>>>>>> like this one: 
>>>>>> 
>>>>>> http://www.ibm.com/support/knowledgecenter/#!/SSY2V3_4.3.0/com.ibm.entpli.doc_4.3/lr/preface_plugin.htm
>>>>>>  
>>>>>> <http://www.ibm.com/support/knowledgecenter/#!/SSY2V3_4.3.0/com.ibm.entpli.doc_4.3/lr/preface_plugin.htm>
>>>>>> 
>>>>>> especially under sub-topic “Data elements” 
>>>>>> 
>>>>>> (however, don’t take everything for granted, PL/1 is still a very young 
>>>>>> language :o) 
>>>>>> Unfortunately OOP never made it into PL/1 because with it, it would be 
>>>>>> nearly perfect.)
>>>>>> 
>>>>>> Should I make a new swift-evolution topic for fixed decimal?
>>>>>> 
>>>>>> Kind Regards
>>>>>> TedvG
>>>>>> 
>>>>>> _______________________________________________
>>>>>> swift-evolution mailing list
>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>> 
>>> 
> 

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

Reply via email to