Clojure ^:const如何工作?

我试图理解什么^:const在clojure。这是dev docs说的。 http://dev.clojure.org/display/doc/1.3

(def constants
{:pi 3.14
:e 2.71})

(def ^:const pi (:pi constants))
(def ^:const e (:e constants))

The overhead of looking up :e and :pi in the map happens at compile time, as (:pi constants) and (:e constants) are evaluated when their parent def forms are evaluated.

这是令人困惑的,因为元数据是var绑定到符号pi,var绑定到符号e,但下面的句子说它有助于加快地图查找,而不是var查找。

有人可以解释什么^:const是做的和使用它背后的理由吗?这与使用巨大的let块或使用像(pi)和(e)的宏相比?

这看起来像一个坏的例子给我,因为关于地图查找的东西只是混淆的问题。

一个更现实的例子是:

(def pi 3.14)
(defn circumference [r] (* 2 pi r))

在这种情况下,圆周的主体被编译为在运行时(通过调用Var.getRawRoot)取消引用pi的代码,每次调用圆周。

(def ^:const pi 3.14)
(defn circumference [r] (* 2 pi r))

在这种情况下,圆周被编译成完全相同的代码,就像它已经这样写:

(defn circumference [r] (* 2 3.14 r))

也就是说,调用Var.getRawRoot被跳过,这节省了一点时间。这里是一个快速测量,其中circ是上面的第一个版本,circ2是第二个版本:

user> (time (dotimes [_ 1e5] (circ 1)))
"Elapsed time: 16.864154 msecs"
user> (time (dotimes [_ 1e5] (circ2 1)))
"Elapsed time: 6.854782 msecs"
http://stackoverflow.com/questions/9162558/how-does-clojure-const-work

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Clojure ^:const如何工作?