2011-09-26 66 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之外的其他東西時,則會生成其他表單。 –