Clojure中点运算符和完全限定命名调用的区别
我在学Clojure。我仍然没有很好的理解 为了语言和哲学 但我想更熟悉这门语言。因此 我已经开始阅读Clojure核心API文档 并在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.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()