require
被实现为函数而不是宏,因此它需要一个引用的libspec。如果使用未引用的libspec,则会像这样进行评估:user=> [clojure.set :as s]
CompilerException java.lang.ClassNotFoundException: clojure.set
user=> (use 'clojure.pprint)
nil
user=> (pprint (macroexpand '(ns foo (:require [clojure.set :as s]))))
(do
(clojure.core/in-ns 'foo)
(clojure.core/with-loading-context
(clojure.core/refer 'clojure.core)
(clojure.core/require '[clojure.set :as s]))
(if
(.equals 'foo 'clojure.core)
nil
(do
(clojure.core/dosync
(clojure.core/commute
@#'clojure.core/*loaded-libs*
clojure.core/conj
'foo))
nil)))
nil
正如你所看到的,ns
只是将 libspec 原封不动地传递给 require,并在传递之前为你加上引号,因此你不必自己添加。
user> (= '[a b c] ['a 'b 'c])
=> true
require
表单可以采用引用命名空间的带引号符号形式,也可以采用带引号符号的带有进一步限制的带引号符号向量形式。