Что такое 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
Другие вопросы по тегам