Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“^”是什么意思“静态”;你在Clojure做什么?_Clojure_Metadata - Fatal编程技术网

“^”是什么意思“静态”;你在Clojure做什么?

“^”是什么意思“静态”;你在Clojure做什么?,clojure,metadata,Clojure,Metadata,我在Clojurecore.clj源代码中的许多函数上看到了^:static元数据,例如在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中如此

我在Clojure
core.clj
源代码中的许多函数上看到了
^:static
元数据,例如在
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
中如此频繁地使用?

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


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

根据Google Groups线程,这是一个禁止操作的文件

^:static
一段时间以来一直是不可操作的,在前一段时间对vars进行了更改后变得不必要


-Chas Emerick在Clojure 1.3的开发中,Rich希望增加函数返回对象以外类型的能力。这将允许使用本机数学运算符,而无需将所有内容塞进一个函数中

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


这是后来完全自动,所以你不需要再添加这个了

当你说全自动时,你的意思是在clojure编译器的最新版本中生成双胞胎并对每个函数执行这样的优化,无论是否标记为^static?当类型注释导致编译器确定一个函数可以生成除Object之外的其他形式时,则会生成其他形式。