What is strange, I see different results with Clojure 1.4.0 and Java (TM) SE Runtime Environment (build 1.7.0_06-b24), on Ubuntu 12.04 64bit:
user=> *clojure-version* {:major 1, :minor 4, :incremental 0, :qualifier nil} user=> (+ Integer/MAX_VALUE Integer/MAX_VALUE) 4294967294 user=> (type 1) java.lang.Long user=> (def max-plus-one (+ Integer/MAX_VALUE one))
You can always check the Java classes that clojure.core uses for numerical calculations to find out how the functionality is implemented:
Operator implementation + in:
(defn + "Returns the sum of nums. (+) returns 0. Does not auto-promote longs, will throw on overflow. See also: +'" {:inline (nary-inline 'add 'unchecked_add) :inline-arities >1? :added "1.2"} ([] 0) ([x] (cast Number x)) ([xy] (. clojure.lang.Numbers (add xy))) ([xy & more] (reduce1 + (+ xy) more)))
Java implementation of adding longs:
final public Number add(Number x, Number y){ return num(Numbers.add(x.longValue(),y.longValue())); }
Edit: Tested with Clojure 1.2.1
I did a quick test with Clojure 1.2.1, and with this version of Clojure I get exactly your behavior.
user=> *clojure-version* {:major 1, :minor 2, :incremental 1, :qualifier ""} user=> (def one 1) #'user/one user=> (class 1) java.lang.Integer user=> (def max-plus-one (+ Integer/MAX_VALUE one)) #'user/max-plus-one user=> max-plus-one 2147483648 user=> (class max-plus-one) java.lang.Long user=> (+ Integer/MAX_VALUE Integer/MAX_VALUE) java.lang.ArithmeticException: integer overflow (NO_SOURCE_FILE:0)
I would say that you ran the test with Clojure 1.2.x, not 1.4.0. What is the meaning of * clojure -version * in your REPL?
raju-bitter
source share