“为什么?”;使用「;在Clojure call中;在ns中“;要返回到原始名称空间?
在Clojure“为什么?”;使用「;在Clojure call中;在ns中“;要返回到原始名称空间?,clojure,namespaces,Clojure,Namespaces,在Clojureuse中,加载一个lib,并引用lib的名称空间 加载 那么,在使用use加载库时隐式调用ns中的命令的目的是什么 user=> (use 'project.core :verbose) (clojure.core/load "/project/core") (clojure.core/in-ns 'user) (clojure.core/refer 'project.core) 换句话说,上一个示例中的(clojure.core/In-ns'user)不是不必要的吗?注
use
中,加载一个lib,并引用lib的名称空间
加载
那么,在使用use
加载库时隐式调用ns中的命令的目的是什么
user=> (use 'project.core :verbose)
(clojure.core/load "/project/core")
(clojure.core/in-ns 'user)
(clojure.core/refer 'project.core)
换句话说,上一个示例中的(clojure.core/In-ns'user)
不是不必要的吗?注意:忽略初始时间戳。在正确答案上,米夏马尔齐克远远领先于我。我很快删除了我最初不正确的答案,正要写这篇更正文章时,我注意到了米夏马尔齐克的答案。
详细输出是您需要在REPL上执行的子命令集,以达到相同的效果,而不是正在执行的实际命令
在执行线程中,名称空间正在更改,因此在加载
之后,在引用/alias
之前不需要实际的In ns
命令来确保正确的目标名称空间
但是,在REPL上,load
不会更改REPL的名称空间,因此有必要在refere/alias
之前确保正确的名称空间。这在递归引用或别名时发生
对于复杂的库,这一点更为明显:
user=> (use 'clojure.core.async :verbose)
(clojure.core/load "/clojure/core/async")
(clojure.core/load "/clojure/core/async/impl/protocols")
(clojure.core/in-ns 'clojure.core.async)
(clojure.core/alias 'impl 'clojure.core.async.impl.protocols)
...
user=>(使用'clojure.core.async:verbose)
(clojure.core/load“/clojure/core/async”)
(clojure.core/load“/clojure/core/async/impl/protocols”)
(clojure.core/in-ns的clojure.core.async)
(clojure.core/alias'impl'clojure.core.async.impl.protocols)
...
如果我们在REPL上跟踪,那么ns
中的对于别名
在适当的命名空间中执行是绝对必要的。否则,它将从用户名称空间执行。它实际上不会在ns中调用——它只在“详细加载”时打印这一行(也就是说,如果您将:verbose
作为使用
的一个选项传入),以便您知道引用发生在哪个名称空间中。如果使用:as调用require
,以明确将在哪个命名空间中创建别名,也可以这样做:
user=> (require '[clojure.set :as set] :verbose)
(clojure.core/load "/clojure/set")
(clojure.core/in-ns 'user)
(clojure.core/alias 'set 'clojure.set)
当初始加载导致递归加载更多名称空间时,这非常有用。例如,这里是的输出(需要'[clojure.core.rrb-vector:as fv]:verbose)
(可以说参考
行也可以使用ns
行处理中的解释性):
下面是clojure.core/load lib
的源代码的相关片段(打印输出来自此):
需要ns
是一个局部变量,其值为(或as use)
–也就是说,如果指定了:as
别名或负载是由use
引起的,则为truthy
如果要检查整个函数,请在REPL处说(source clojure.core/load lib)
(clojure.core/load "/clojure/core/rrb_vector")
(clojure.core/load "/clojure/core/rrb_vector/protocols")
(clojure.core/refer 'clojure.core.rrb-vector.protocols :refer '[slicev splicev])
(clojure.core/load "/clojure/core/rrb_vector/nodes")
(clojure.core/refer 'clojure.core.rrb-vector.nodes :refer '[ams object-am object-nm primitive-nm empty-pv-node empty-gvec-node])
(clojure.core/load "/clojure/core/rrb_vector/rrbt")
(clojure.core/refer 'clojure.core.rrb-vector.protocols :refer '[PSliceableVector slicev PSpliceableVector splicev])
(clojure.core/refer 'clojure.core.rrb-vector.nodes :refer '[ranges overflow? last-range regular-ranges first-child last-child remove-leftmost-child replace-leftmost-child replace-rightmost-child fold-tail new-path index-of-nil object-am object-nm primitive-nm])
(clojure.core/load "/clojure/core/rrb_vector/transients")
(clojure.core/refer 'clojure.core.rrb-vector.nodes :refer '[ranges last-range])
(clojure.core/refer 'clojure.core.rrb-vector.transients :refer '[transient-helper])
(clojure.core/load "/clojure/core/rrb_vector/fork_join")
(clojure.core/load "/clojure/core/reducers")
(clojure.core/in-ns 'clojure.core.reducers)
(clojure.core/alias 'walk 'clojure.walk)
(clojure.core/in-ns 'clojure.core.rrb-vector.fork-join)
(clojure.core/alias 'r 'clojure.core.reducers)
(clojure.core/in-ns 'clojure.core.rrb-vector.rrbt)
(clojure.core/alias 'fj 'clojure.core.rrb-vector.fork-join)
(clojure.core/refer 'clojure.core.protocols :refer '[IKVReduce])
(clojure.core/in-ns 'clojure.core.rrb-vector.rrbt)
(clojure.core/alias 'r 'clojure.core.reducers)
(clojure.core/refer 'clojure.core.reducers :refer '[CollFold coll-fold])
(clojure.core/refer 'clojure.core.rrb-vector.rrbt :refer '[as-rrbt])
(clojure.core/load "/clojure/core/rrb_vector/interop")
(clojure.core/refer 'clojure.core.rrb-vector.protocols :refer '[PSliceableVector slicev PSpliceableVector splicev])
(clojure.core/refer 'clojure.core.rrb-vector.rrbt :refer '[as-rrbt])
(clojure.core/in-ns 'user)
(clojure.core/alias 'fv 'clojure.core.rrb-vector)
;; as of Clojure 1.6.0
(when (and need-ns *loading-verbosely*)
(printf "(clojure.core/in-ns '%s)\n" (ns-name *ns*)))
(when as
(when *loading-verbosely*
(printf "(clojure.core/alias '%s '%s)\n" as lib))
(alias as lib))