2009-07-24 30 views
29

你是如何在Clojure程序中使用元數據的?Clojure元數據的一些用途是什麼?

我看到編程Clojure的一個例子:

(defn shout [#^{:tag String} message] (.toUpperCase message)) 
;; Clojure casts message to String and then calls the method. 

都有些什麼用途?這種編程形式對我來說是全新的。

回答

1

元數據被編譯器廣泛用於存儲對象類型等內容。
你,當你給類型提示

(defn foo [ #^String stringy] .... 

我已經用它的東西像存儲已添加了一些填充量使用。它的目的是提供與數據「正交」的信息,在決定數值是否相同時不應考慮。

24
  • Docstrings作爲元數據存儲在:doc密鑰下。這可能是元數據使用最多的數字1。
  • 可以選擇使用元數據標記返回值和參數類型,以避免在運行時反映類型的開銷,從而提高性能。這些也被稱爲「類型提示」。 #^String是一種類型提示。
  • 存儲「引擎蓋下」供編譯器使用的內容,例如函數的arglist,已定義var的行號或var是否保存對宏的引用。這些通常由編譯器自動添加,通常不需要由用戶直接操作。
  • 創建測試用例簡單的函數定義的一部分:

    (defn #^{:test (fn [] (assert true))} something [] nil)

    (test #'something)

如果你正在讀編程Clojure的,那麼第2章提供了一個很好的介紹,以元數據。圖2.3提供了常用元數據的一個很好的總結。

14

多樣性的一些答案,不專注於互動與語言本身:

你也可以如。跟蹤一些數據的來源。未檢查的輸入標記爲:tainted。驗證器可能會檢查一些事情,然後將狀態設置爲:clean。執行安全相關事項的代碼然後可以在:tainted上禁止並僅接受:clean ed輸入。

5

元數據對我來說是非常有用的打字目的。我所說的不僅僅是類型提示,而是關於完整的自定義類型系統。最簡單的例子 - 超載對於結構印刷方法(或任何其他VAR):

(defstruct my-struct :foo :bar :baz) 

(defn make-my-struct [foo bar baz] 
    (with-meta (struct-map my-struct :foo foo :bar baz :baz baz) 
     {:type ::my-struct})) 


(defmethod print-method 
    [my-struct writer] 
    (print-method ...)) 

在一般情況下,一起使用Clojure驗證功能,它可以提高安全性,並在同一時間,你的代碼的靈活性非常非常(儘管實際編碼需要一些時間)。請參閱types-api