`是否需要`子命名空间:作为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>