Clojure 中的 "^:static" 有啥作用?

Posted

技术标签:

【中文标题】Clojure 中的 "^:static" 有啥作用?【英文标题】:What does "^:static" do in Clojure?Clojure 中的 "^:static" 有什么作用? 【发布时间】:2011-11-25 01:00:31 【问题描述】:

我在 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 中如此频繁地使用?

【问题讨论】:

【参考方案1】:

在 Clojure 1.3 的开发过程中,Rich 希望为函数添加返回 Object 以外的类型的能力。这将允许使用本机数学运算符,而不必将所有内容都塞进一个函数中。

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

这后来被完全自动化了,所以你不需要再添加了。

【讨论】:

当您说全自动时,您的意思是在最近的clojure 编译器版本中生成双胞胎并为每个函数执行这样的优化无论是否标有^static? 当类型注解导致编译器判断一个函数可以产生Object以外的东西时,就会产生其他形式。【参考方案2】:

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

^:static AFAIK 已经有一段时间没有操作了,在不久前对 vars 进行更改后变得不必要了。

— a May 2011 post 来自 Chas Emerick

【讨论】:

【参考方案3】:

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

http://clojuredocs.org/clojure_core/clojure.core/seq_q http://clojuredocs.org/clojure_core/1.2.0/clojure.core/seq_q

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

【讨论】:

以上是关于Clojure 中的 "^:static" 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

对 Clojure 中的“let”感到困惑

线程“main”中的异常 java.lang.ExceptionInInitializerError (Clojure)

如何具体化 Prolog 的回溯状态以执行与 Clojure 中的“lazy seq”相同的任务?

Clojure :: (String/format "%s" "a") :: 失败并出现 ClassCastException

为啥我不能在“|”处分开在clojure中[重复]

理解clojure语法