Clojure中点运算符和完全限定命名调用之间的区别

时间:2013-03-13 01:55:58

标签: 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 ~@nf)))
   :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)

有任何技术差异吗?或任何好处?

1 个答案:

答案 0 :(得分:7)

Clojure中的点用于主机互操作(在本例中使用Java类clojure.lang.RT)。静态方法的惯用形式是(Classname/staticMethod args*),但它会扩展为.特殊形式的调用。在get函数的情况下,您基本上是在查看Clojure实现的一部分。没有理由为什么低级Clojure代码会使用更高级别的宏 - 所以它直接使用.形式。

请查看以下文档:http://clojure.org/java_interop

惯用形式位于顶部和下方,您可以找到它们如何扩展为点运算符的调用。这是静态方法的相关位:

(Classname/staticMethod args*) ==> (. Classname staticMethod args*)