这是因为require
是作为函数而不是宏实现的,因此需要带引号的libspec。一个未加引号的libspec将像这样评估:
user=> [clojure.set :as s]
CompilerException java.lang.ClassNotFoundException: clojure.set
从而产生一个错误。
但是,ns
作为宏实现,并且可以完全控制是否或何时进一步评估其参数,因此您无需引用libspec。您可以查看ns的宏扩展,看看扩展它会发生什么:
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并在传递要求之前将其引用给您,因此您不必这样做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句