2013-01-06 47 views

回答

0

:標籤元數據的價值是什麼?

我發現Clojure的正式文件

Clojure - Metadata

^String obj - Sets the value of :tag key in the object’s metadata. 
Equivalent to ^{:tag java.lang.String} obj 
Used to hint an objects type to the Clojure compiler. 
See Java Interop: 
    Type Hints for more information and a complete list of special type hints. 

Type Hints

Clojure supports the use of type hints to assist the compiler 
in avoiding reflection in performance-critical areas of code. 

究竟是什麼,如果我不能輸入和輸出PARAMS區分信息傳送?

您不需要指定輸入或輸出參數的類型。而且,如果沒有指定,clojure將通過反射執行該功能(根據此描述)。

還有另一個blog post。 根據這篇文章,Clojure使用IFn接口來創建Clojure代碼創建的所有方法。

IFn defines all arguments of .invoke to be of type Object. 
So you can pass anything you like to a Clojure function. 
It doesn't matter which type it is, because everything is an Object anyway. 

所以,我想打電話給Clojure的方法,而類型提示和調用Java的反射.invoke是相同的。

0

我有同樣的問題在閱讀這有小幅更新,例如編程的Clojure第三版:

(defn ^{:tag String} shout [^{:tag String} s] (clojure.string/upper-case s)) 

這相當於簡稱:

; I guess tags and type hints are equivalent 
(defn ^String shout [^String s] (clojure.string/upper-case s)) 

像你所說,如果如果標籤引用輸入或輸出參數,則查找函數元數據時模糊不清:

(meta #'shout) 

...返回

{:tag java.lang.String, 
:arglists ([s]), 
etc... } 

如果你仔細想想,它必須是返回類型,因爲一個函數可以有N個參數,但Clojure中不允許多個返回值。元數據中的:標記不是矢量,而是單個值。

如果你確實需要編程的功能參數的標識符/類型提示,你可以呼籲元功能:arglists如下所示:

https://stackoverflow.com/a/26116353/695318