Что такое Clojure Intrinsics
Просматривая исходный код Clojure, я наткнулся на Intrinsics.java
файл. Похоже, что это отображение некоторых функций времени выполнения для кодов операций JVM.
Однако я не уверен, где они применяются. Следующий код
(def ^:const pi 3.141592)
(defn circumference [^double r] (* r 2.0 pi))
компилируется в
public static java.lang.Object invokeStatic(double r);
0 dload_0 [r]
1 ldc2_w <Double 2.0> [14]
4 dmul
5 ldc2_w <Double 3.141592> [16]
8 invokestatic clojure.lang.Numbers.multiply(double, double) : double [23]
11 invokestatic java.lang.Double.valueOf(double) : java.lang.Double [29]
14 areturn
и я вижу что clojure.lang.Numbers.multiply(double, double) : double
не заменили на DMUL
,
Как именно используются внутренние компоненты? Спасибо.
1 ответ
В настоящее время встроенные функции используются только в том случае, если скомпилированное выражение должно оставаться распакованным. Таким образом (* 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