“^:static”在Clojure中做了什么?

时间:2011-09-26 08:42:45

标签: clojure metadata

我在Clojure ^:static源代码中看到了很多函数的core.clj元数据,例如:在seq?

的定义中
(def
 ^{:arglists '([x])
   :doc "Return true if x implements ISeq"
   :added "1.0"
   :static true}
 seq? (fn ^:static seq? [x] (instance? clojure.lang.ISeq x)))

这个元数据究竟做了什么,以及为什么它在core.clj中经常使用?

3 个答案:

答案 0 :(得分:38)

在Clojure 1.3的开发中,Rich想要添加函数返回Object以外的类型的能力。这将允许使用本机数学运算符,而无需将所有内容都塞入一个函数中。

原始实现需要将支持此功能的函数标记为:static。这个元数据导致编译器为函数生成两个版本,一个返回Object,另一个返回该特定类型。在编译器确定类型总是匹配的情况下,将使用更具体的版本。

后来这是全自动的,所以你不需要再添加它了。

答案 1 :(得分:9)

根据Google网上论坛帖子“Type hinting inconsistencies in 1.3.0”这是一个无操作

  

^:static一段时间以来一直是AFAIK的无操作,一段时间后变为vars就变得没必要了。

Chas Emerick

- a May 2011 post

答案 2 :(得分:-3)

似乎它是clojure 1.3中的新元数据属性。您可以比较1.3和1.2之间的来源:

所以我认为它与^:dynamic有关,它表示var是否允许动态绑定。只是我的猜测。在我看到有关此属性的文档之前不确定。