我在一个名称空间中定义了一个函数
(ns package.sub)
(defn func1[]....)
我希望将其包含在另一个名称空间中... (ns package.main)
以便我可以从其他图书馆使用它:
(ns app.core
(:use [package.main :only [func1]))
最简单的方法是什么?
答案 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体验的信息。所有自定义宏(如defalias
和immigrate
)基本上都与上面的def
形式相同(可能使用intern
和/或调用方法来重置目标的根绑定Vars)在注意转移元数据的同时;你可以选择你最喜欢的那个并使用它。
请注意,目标Vars与源Vars完全分开,例如可以是如果标记binding
,则:dynamic
单独反弹,给出不同的根值等。