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 at http://groups.google.com/group/clojure?hl=en