"^:static"在Clojure中做了什么?

mik*_*era 33 metadata clojure

^:static在Clojure 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)))
Run Code Online (Sandbox Code Playgroud)

这个元数据究竟做了什么,为什么它在整个过程中频繁使用core.clj

Art*_*ldt 39

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

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

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

  • 当类型注释导致编译器确定函数可以生成除Object之外的其他内容时,将生成其他表单. (2认同)

bmi*_*are 9

根据谷歌集团的主题"在1.3.0中输入提示不一致",这是一个无操作.

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

- Chas Emerick 2011年5月的一篇文章