2013-03-13 40 views
5

我正在學習Clojure。對於語言和哲學,我仍然沒有很好的理解 。Clojure中點運算符和完全合格的命名調用的區別

但我想更熟悉這門語言。因此 我已經開始閱讀Clojure核心API文檔 ,並在clojure.core/get源代碼中發現了一些有趣的東西。

(defn get 
    "Returns the value mapped to key, not-found or nil if key not present." 
    {:inline (fn [m k & nf] `(. clojure.lang.RT (get ~m ~k [email protected]))) 
    :inline-arities #{2 3} 
    :added "1.0"} 
    ([map key] 
    (. clojure.lang.RT (get map key))) 
    ([map key not-found] 
    (. clojure.lang.RT (get map key not-found)))) 

要獲得給定鍵的值,代碼使用clojurelang.RT/get函數。代碼調用點運算符 - (. clojure.lang.RT (get map key))

我的問題是作者爲什麼寫(. clojure.lang.RT (get map key))而不是 (clojure.lang.RT/get map key)

有沒有技術上的區別?或者任何好處?

+0

在定義之前是否定義了'classname/method'語法?我的猜測是'clojure.lang.RT/get'在編譯的時候會是一個語法錯誤。 – ToBeReplaced 2013-03-13 02:41:17

+0

'clojure.core''代碼可能不是開始理解語言哲學的好地方,因爲它傾向於使用最低級別的表單。你應該更好地查看一些完善的庫,比如環形的乾淨的HTTP抽象(https://github.com/mmcgrana/ring/)或者路由DSL的組合(https://github.com/weavejester/compojure) – sw1nn 2013-03-13 09:38:35

回答

7

Clojure中的點用於主機互操作(在這種情況下,使用Java類clojure.lang.RT)。靜態方法的慣用形式是(Classname/staticMethod args*),但它被擴展爲.特殊形式的調用。在get函數的情況下,您基本上正在查看Clojure實現的一部分。沒有理由爲什麼較低級別的Clojure代碼會使用更高級別的宏 - 因此它直接使用.表單。

看看在文檔:http://clojure.org/java_interop

慣用的形式是在頂部和下面你可以找到他們是如何擴展到上點運算符調用。以下是靜態方法的相關位:

(Classname/staticMethod args*) ==> (. Classname staticMethod args*) 
相關問題