什么时候在 clojure require 中包含撇号?

When to include apostrophe in clojure require?

有什么区别:

(require '[some-package.sub as some])
(require 'example.core)

(require [some-package.sub as some])
(require example.core)

我什么时候应该使用一个而不是另一个?只有带撇号的才能在 REPL 环境中工作。

require 是一个函数(在 REPL 中用 (source require) 检查)。因此在它自己的评估之前评估它的参数。

当你调用 require 符号时 some-package.sub 解析 (points) 为空,所以你得到 "Unable to resolve symbol: the-symbol-that-points-to-nothing in this context..."

然而,如果你引用所述符号,我们可以得到 require 的实际评估。因此 require,因为它是一个函数,所以需要引用形式。

现在 ns 是一个宏(在 REPL 中检查 (source ns))。因此在扩展之前不评估其参数。从技术上讲,它可以采用自由符号或引用形式,但决定使用原始自由符号。 (ns lalala (:require [some-package.sub :as some]))

No-o-o-o-ow,当您使用 a 调用 require(函数)时,您实际上需要由 a 解析为的 var 持有的符号。

示例:

(def a 'B)
(require a)
FileNotFoundException Could not locate B__init.c;ass or B.clj on the classpath[...]

...那是因为 require 是一个函数。

希望对您有所帮助。