I think Cristophe is on the right path. But it is possible that there is another Bug concerning primitive functions. Consider the following two functions:
(defn fib ^long [^long n] (if (<= n 1) 1 (+ (fib (dec n)) (fib (- n 2))))) (defn fib2 ^double [^double n] (if (<= n 1) 1 (+ (fib2 (dec n)) (fib2 (- n 2))))) The bytecode of `fib` ends as expected with 42 invokestatic 81; /* long clojure.lang.Numbers.minus(long arg0, long arg1) */ 45 invokeinterface 77 3; /* long invokePrim(long arg0) */ 50 invokestatic 84; /* long clojure.lang.Numbers.add(long arg0, long arg1) */ 53 lreturn; But `fib2` boxes and unboxes again: 45 invokestatic 83; /* double clojure.lang.Numbers.minus(double arg0, long arg1) */ 48 invokeinterface 79 3; /* double invokePrim(double arg0) */ 53 invokestatic 87; /* double clojure.lang.Numbers.add(double arg0, double arg1) */ 56 invokestatic 92; /* java.lang.Double java.lang.Double.valueOf(double arg0) */ 59 checkcast 94; /* java.lang.Number */ 62 invokevirtual 98; /* double doubleValue() */ 65 dreturn; I also rewrote the multiply-and-square algorithm so that it does not use `loop`: (defn multiply-and-square ^double [^double result, ^double factor, ^long c] (if (> c 0) (recur (if (first-bit? c) (* result factor) result), (* factor factor), (bit-shift-right c 1)) result)) (defn exp-int2 ^double [^double x, ^long c] (multiply-and-square 1.0, x, c)) Here the bytecode of `exp-int2` looks fine, but the recursive function `multiply-and-square` performs the boxing and unboxing again: 43 dload_1; /* result */ 44 invokestatic 70; /* java.lang.Double java.lang.Double.valueOf(double factor) */ 47 checkcast 72; /* java.lang.Number */ 50 invokevirtual 76; /* double doubleValue() */ 53 dreturn; Christophe, can you try `fib2` with your patched Clojure? -- 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