I think there's a fundamental assumption that I disagree with. Since we've already opened the can of worms that is auto-promotion, it should *always* work. Given auto-promotion, + shouldn't be fast (use unchecked-add), it should be predictable. Same for -, * and friends. Quality is more important than performance, principle of least surprise, etc.
Sean On May 5, 10:47 am, David Nolen <dnolen.li...@gmail.com> wrote: > On Wed, May 5, 2010 at 10:32 AM, Sean Devlin <francoisdev...@gmail.com>wrote: > > > And I was too quick to post. Sorry about that. > > > You've got the unchecked addition fn for speed, and those are allowed > > the throw overflow errors. The + fn is always supposed to work. The > > fact that it auto-promotes the bound version is proof. It needs to > > work with the literal, too. > > > It's a Clojure issue, not a JVM one. That's why this needs to be > > fixed. > > > Sean > > Primitive types are only preserved in let bindings. From what I can tell the > primitive int gets promoted to an Integer when placed in a var. + is not > auto promoting, storing the primitive in a var is auto promoting. Thus + > works fine in the first case. In the second case Integer/MAX_VALUE is a Java > static method so it's primitive return type is known - int, thus the > overflow error. For example: > > (def a (int 1)) > (def b (int 2)) > > ; slow generic math > (dotimes [_ 10] > (time > (dotimes [_ 1000000] > (+ a b)))) > > ; let binding preserves primitive type > ; fast math > (let [a (int 1) > b (int 2)] > (dotimes [_ 10] > (time > (dotimes [_ 1000000] > (+ a b))))) > > So the following will also throw an overflow exception: > > (def max-int Integer/MAX_VALUE) > (+ (int max-int) (int max-int)) > > So this seems like programmer error to me, but again that's because what > returns primitive types and where primitive types are preserved is not > totally intuitive (though pretty well documented I think) > > David > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with your > first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group > athttp://groups.google.com/group/clojure?hl=en -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en