Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“为什么?”;使用「;在Clojure call中;在ns中“;要返回到原始名称空间?_Clojure_Namespaces - Fatal编程技术网

“为什么?”;使用「;在Clojure call中;在ns中“;要返回到原始名称空间?

“为什么?”;使用「;在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)不是不必要的吗?注

在Clojure
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))