+1 I am strictly against implicit conversions where data loss may happen. I am even against implicit conversions which are just expensive.
With regards to the argument of counting on the developers intelligence I think that is a task for compilers just like type checking. -Thorsten > Am 30.03.2016 um 23:38 schrieb Developer via swift-evolution > <swift-evolution@swift.org>: > > > > >>> 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> 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). 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> のメッセージ: >>> >>>> 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> 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> 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> のメッセージ: >>>>>> >>>>>>> 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 >>>>>>> >>>>>>> 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 >>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution >>>>>> _______________________________________________ >>>>>> swift-evolution mailing list >>>>>> swift-evolution@swift.org >>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution > > _______________________________________________ > swift-evolution mailing list > swift-evolution@swift.org > https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution