`require`子命名空间:作为Clojure中的简写?

时间:2014-02-07 17:50:38

标签: clojure

假设我们有一个包含名称空间的项目:proj.fooproj.barproj.baz。由于我们位于proj的上下文中,因此我们希望访问foo/foo 无前缀,而不是proj.foo/foo。您可以使用ns执行此操作,但这很详细:

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

有没有简便的方法来实现这一目标?这似乎是一项普遍的任务。

2 个答案:

答案 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在这种情况下,} {},foobar在技术上不是名称空间。您只是使用不同的文件来构建单个ns baz。每个包含的文件都应包含 proj表单,上面的示例假设此文件夹结构(请注意,您没有为(ns ...)指定.clj扩展名):

(load ...)