Что такое Clojure Intrinsics - PullRequest
       7

Что такое Clojure Intrinsics

0 голосов
/ 30 августа 2018

Просматривая исходный код 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 Ответ

0 голосов
/ 02 сентября 2018

В настоящее время встроенные функции используются только в том случае, если скомпилированное выражение должно оставаться неупакованным. Таким образом, умножение (* 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
...