我正在学习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)
。
有任何技术差异吗?或任何好处?
答案 0 :(得分:7)
Clojure中的点用于主机互操作(在本例中使用Java类clojure.lang.RT)。静态方法的惯用形式是(Classname/staticMethod args*)
,但它会扩展为.
特殊形式的调用。在get
函数的情况下,您基本上是在查看Clojure实现的一部分。没有理由为什么低级Clojure代码会使用更高级别的宏 - 所以它直接使用.
形式。
请查看以下文档:http://clojure.org/java_interop
惯用形式位于顶部和下方,您可以找到它们如何扩展为点运算符的调用。这是静态方法的相关位:
(Classname/staticMethod args*) ==> (. Classname staticMethod args*)