В настоящее время встроенные функции используются только в том случае, если скомпилированное выражение должно оставаться неупакованным. Таким образом, умножение (* r 2.0)
в вашем примере действительно получает внутреннюю обработку (в результате получается умножение на dmul
в вашем примере invokeStatic
), а умножение (* #<result of (* r 2.0)> 3.141592)
- нет.
Вы можете получить clojure.lang.Numbers.multiply(double, double) : double
, который будет применен к умножению на r
, также убедившись, что тип возвращаемого значения равен double
.
Например, это:
(def ^:const pi 3.141592)
(defn circumference ^double [^double r] (* r 2.0 pi))
компилируется в следующее:
public static double invokeStatic(double r);
0 dload_0 [r]
1 ldc2_w <Double 2.0> [14]
4 dmul
5 ldc2_w <Double 3.141592> [16]
8 dmul
9 dreturn