为什么在“使用”(在clojure中)使用围绕向量的单引号?

时间:2015-12-06 14:36:17

标签: clojure

当我使用一些长函数名时,我使用了use形式,如下所示:

(use '[clojure.string :as str])

但我不知道为什么在向量中添加单引号 ',所以我试图找出它的类型:

(type '[clojure.string :as str])
;=> clojure.lang.PersistentVector

简化示例:

(type ["hello"])
;=> clojure.lang.PersistentVector

(type '["hello"])
;=> clojure.lang.PersistentVector

似乎单引号不会改变任何内容,任何人都可以用use形式解释它的用法吗?

2 个答案:

答案 0 :(得分:10)

目的是引用符号。通过这种方式,它们将被视为符号,use可以将这些符号作为命名空间来加载和拉入当前符号。您希望避免对符号进行默认处理,该符号将其解析为Var的名称并使用该Var的值。你也可以这样做

(use ['clojure.string :as 'str])

但这涉及一些不必要的打字;引用整个向量会让你不太可能忘记任何事情。特别是如果您使用:only:refer或类似的关键字参数执行任何操作。

除此之外:ns并不需要这个,因为作为一个宏,它可以控制对其参数的评估 - 像requireuse这样的函数在之前读取和评估它们的所有参数他们自己跑。这是ns通常比这些函数更受欢迎的部分原因。

答案 1 :(得分:3)

use是一个函数,因此评估者在传递参数之前对其参数进行评估(应用程序订单评估)。

您不希望评估[clojure.string :as str],因为评估者会在应用use之前尝试解析其中的符号而不会成功。

因此,quote(读者速记')可以阻止他们的评估。