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

Clojure中点运算符和完全限定命名调用的区别,clojure,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)

我在学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(获取映射键))

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


有技术上的区别吗?还有什么好处吗?

Clojure中的点用于主机互操作(在本例中使用Java类Clojure.lang.RT)。静态方法的惯用形式是
(Classname/staticMethod args*)
,但它扩展为对
特殊形式的调用。对于
get
函数,您实际上看到的是Clojure实现的一部分。低级Clojure代码没有理由使用高级宏,因此它直接使用
表单

请参阅以下文档:

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

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

在定义之前是否定义了
classname/method
语法?我的猜测是,
clojure.lang.RT/get
在编译过程中会出现语法错误。
clojure.core
代码可能不是理解语言哲学的好起点,因为它倾向于使用最低级别的形式。您最好看看成熟的库,比如ring for a clean HTTP abstraction()或compojure for a routing DSL()