2011-09-26 31 views
31

我已经在Clojure core.clj源代码中看到了很多功能上的^:static元数据,例如,在seq?定义:“^:static”在Clojure中做了什么?

(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使用如此频繁?

回答

34

在Clojure中1.3的开发丰富的想添加的函数返回其他类型的对象比的能力。这将允许使用本地数学运算符,而不必将所有内容都塞进一个函数中。

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

这是后来做成全自动的,所以你不需要再添加这个。

+1

当你说*全自动*,你的意思是在最近的clojure编译器版本产生双胞胎,并执行这样的优化*为每个功能*无论标记为^静态或不是? –

+2

当类型注释导致编译器确定某个函数可以产生除Object之外的其他东西时,则会生成其他表单。 –