6

我正在学习 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).

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

4

1 回答 1

8

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

查看文档:http ://clojure.org/java_interop

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

(Classname/staticMethod args*) ==> (. Classname staticMethod args*)
于 2013-03-13T03:28:04.663 回答