2013-03-13 14 views
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 [email protected]))) 
    :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

在定义之前是否定义了'classname/method'语法?我的猜测是'clojure.lang.RT/get'在编译的时候会是一个语法错误。 – ToBeReplaced 2013-03-13 02:41:17

+0

'clojure.core''代码可能不是开始理解语言哲学的好地方,因为它倾向于使用最低级别的表单。你应该更好地查看一些完善的库,比如环形的干净的HTTP抽象(https://github.com/mmcgrana/ring/)或者路由DSL的组合(https://github.com/weavejester/compojure) – sw1nn 2013-03-13 09:38:35

回答

7

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

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

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

(Classname/staticMethod args*) ==> (. Classname staticMethod args*) 
相关问题