如何将一个命名空间中的函数包含在另一个命名空间中?

时间:2013-05-24 02:10:35

标签: clojure

我在一个名称空间中定义了一个函数

(ns package.sub)

(defn func1[]....)

我希望将其包含在另一个名称空间中... (ns package.main)

以便我可以从其他图书馆使用它:

(ns app.core
  (:use [package.main :only [func1]))

最简单的方法是什么?

1 个答案:

答案 0 :(得分:3)

我认为通常鼓励用户只需要函数实际存在的命名空间,尽管你指出一些库仍然会“重新导出”Vars。重新导出可能存在问题的主要原因是Clojure中没有实际的重新导出 - 您正在获得具有相同根值的单独Vars(请参阅此答案的结尾)。

如果您坚持从package.main导出该功能,但在package.sub中定义该功能,则只需创建一个Var即可将其保存在package.main中:

(ns package.main
  (:require [package.sub :as sub]))

(def foo sub/foo)

这具有不向新Var传输元数据的缺点,这对于这个用例是不幸的,因为defn上的元数据 - 引入的Vars包含用于支持愉快的REPL体验的信息。所有自定义宏(如defaliasimmigrate)基本上都与上面的def形式相同(可能使用intern和/或调用方法来重置目标的根绑定Vars)在注意转移元数据的同时;你可以选择你最喜欢的那个并使用它。

请注意,目标Vars与源Vars完全分开,例如可以是如果标记binding,则:dynamic单独反弹,给出不同的根值等。