gpt4 book ai didi

clojure - 为什么Clojure中的 "use"会调用 "in-ns"返回原来的命名空间?

转载 作者:行者123 更新时间:2023-12-02 21:16:54 24 4
gpt4 key购买 nike

在 Clojure 中,use 加载一个 lib,此外还引用该 lib 的命名空间。

加载 does not change the current namespace .

那么当使用use加载lib时隐式调用的in-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) 是不是不必要的?

最佳答案

它实际上并不调用 in-ns - 它仅在“详细加载”时打印此行(也就是说,如果您传入 :verbose 作为选项to use),以便您知道引用发生在哪个命名空间中。如果您使用 :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)

当初始加载导致更多命名空间被递归加载时,这非常有用。例如,这是 (require '[clojure.core.rrb-vector :as fv] :verbose) 的输出(可以说 refer 行可以使用解释性 in-ns 行处理也是如此):

(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)

这是 clojure.core/load-lib 源代码的相关片段(这是打印输出的来源):

;; 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))

need-ns 是一个本地值,其值为 (或 as use) – 也就是说,如果指定了 :as 别名,则为 true或者负载是由使用引起的。

如果您想检查整个函数,请在 REPL 中输入 (source clojure.core/load-lib)

关于clojure - 为什么Clojure中的 "use"会调用 "in-ns"返回原来的命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24986465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com