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

pop*_*ome 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 ~@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))))
Run Code Online (Sandbox Code Playgroud)

要使用给定键获取值,代码将使用clojurelang.RT/get函数.代码调用点运算符 - (. clojure.lang.RT (get map key)).

我的问题是作者为什么写(. clojure.lang.RT (get map key))而不是 (clojure.lang.RT/get map key).

有什么技术差异吗?还是有什么好处?

set*_*hev 7

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

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

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

(Classname/staticMethod args*) ==> (. Classname staticMethod args*)
Run Code Online (Sandbox Code Playgroud)