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中的缩写?_Clojure - Fatal编程技术网

`是否需要`子命名空间:作为Clojure中的缩写?

`是否需要`子命名空间:作为Clojure中的缩写?,clojure,Clojure,假设我们有一个具有名称空间的项目:proj.foo,proj.bar,proj.baz。因为我们在proj的上下文中,所以我们希望访问foo/foounfixed,而不是proj.foo/foo。您可以使用ns执行此操作,但它很冗长: (ns proj.qux (:require (proj [foo :as foo] [bar :as bar] [baz :as baz]))) 有没有一种速记方法可以做到

假设我们有一个具有名称空间的项目:
proj.foo
proj.bar
proj.baz
。因为我们在
proj
的上下文中,所以我们希望访问
foo/foo
unfixed,而不是
proj.foo/foo
。您可以使用
ns
执行此操作,但它很冗长:

(ns proj.qux
  (:require (proj
              [foo :as foo]
              [bar :as bar]
              [baz :as baz])))

有没有一种速记方法可以做到这一点?这似乎是一项常见的任务。

这里有几个选项:

(ns proj.qux
  (:require [proj [foo :refer :all] [bar :refer :all]]))
这将允许您使用
proj.foo
等中的所有公共变量,但必须确保这些名称空间中没有与符号的名称冲突

(ns proj)

(load "proj/foo")
(load "proj/bar")
(load "proj/baz")
这也允许您引用那些文件中定义的变量,而不带前缀,但可能不是您想要的:这种方法实际上将这三个文件包含到主
项目
ns中,但是
foo
bar
baz
在本例中从技术上讲不是这样的名称空间。您只需使用不同的文件来构建单个ns
项目
。每个包含的文件都应该有
(ns…
表单,并且上面的示例假定此文件夹结构(请注意,您没有为
(load…
)指定
.clj
扩展名):


我们可以使用
alias
构建您想要的功能

(defn common-alias [ns-symbol]
  (alias ((comp symbol
                #(re-find #"[^.]+$" %)
                name)
          ns-symbol)
         ns-symbol))
用作:

user> string/join
CompilerException java.lang.RuntimeException: No such namespace: string, compiling:(NO_SOURCE_PATH:1:764) 
user> (common-alias 'clojure.string)
nil
user> string/join
#<string$join clojure.string$join@22830870>
user>string/join
CompilerException java.lang.RuntimeException:没有这样的命名空间:string,compiling:(没有源路径:1:764)
用户>(通用别名“clojure.string”)
无
用户>字符串/连接
#

我可以问一下为什么这项议案被否决了吗?我解释说这可能不是OP想要的东西,但请提供更多细节/背景。。。谢谢!我没有投反对票,但我认为这不是一个很好的习惯用语。此外,它还将foo/bar/baz中的所有内容放入当前名称空间——它修改了当前名称空间。我想问的是,只给它们其他名称空间的名称更短的名称空间,但仍然将它们保留在单独的名称空间中。
user> string/join
CompilerException java.lang.RuntimeException: No such namespace: string, compiling:(NO_SOURCE_PATH:1:764) 
user> (common-alias 'clojure.string)
nil
user> string/join
#<string$join clojure.string$join@22830870>