假设我们有一个包含名称空间的项目:proj.foo
,proj.bar
,proj.baz
。由于我们位于proj
的上下文中,因此我们希望访问foo/foo
无前缀,而不是proj.foo/foo
。您可以使用ns
执行此操作,但这很详细:
(ns proj.qux
(:require (proj
[foo :as foo]
[bar :as bar]
[baz :as baz])))
有没有简便的方法来实现这一目标?这似乎是一项普遍的任务。
答案 0 :(得分:1)
我们可以使用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>
答案 1 :(得分:-1)
这里有几个选项:
(ns proj.qux
(:require [proj [foo :refer :all] [bar :refer :all]]))
这将允许您使用来自proj.foo
等所有公共变量,但没有前缀,但您必须确保这些名称空间中没有名称与符号冲突。
(ns proj)
(load "proj/foo")
(load "proj/bar")
(load "proj/baz")
这也允许你引用那些没有前缀的文件中定义的变量,但可能不是你所追求的:这种方法确实将三个文件包含在主proj
ns中,但是{{1在这种情况下,} {},foo
,bar
在技术上不是名称空间。您只是使用不同的文件来构建单个ns baz
。每个包含的文件都应包含否 proj
表单,上面的示例假设此文件夹结构(请注意,您没有为(ns ...)
指定.clj
扩展名):
(load ...)