我在一个命名空间中定义了一个函数
(ns package.sub)
(defn func1[]....)
我希望将它包含在另一个命名空间中......(ns package.main)
这样我就可以从另一个库中使用它:
(ns app.core
(:use [package.main :only [func1]))
最简单的方法是什么?
我在一个命名空间中定义了一个函数
(ns package.sub)
(defn func1[]....)
我希望将它包含在另一个命名空间中......(ns package.main)
这样我就可以从另一个库中使用它:
(ns app.core
(:use [package.main :only [func1]))
最简单的方法是什么?
我相信通常鼓励用户只需要函数实际所在的命名空间,尽管正如您指出的那样,一些库仍然会“重新导出”Var。重新导出可能存在问题的主要原因是 Clojure 中没有实际的重新导出——你得到了碰巧共享相同根值的单独变量(请参阅此答案的结尾)。
如果您坚持从 导出函数package.main
,但在 中定义它package.sub
,您可以简单地创建一个 Var 来保存它package.main
:
(ns package.main
(:require [package.sub :as sub]))
(def foo sub/foo)
这具有不将元数据传输到新 Var 的缺点,这对于这个用例来说是不幸的,因为defn
-introduced Vars 上的元数据包含用于支持愉快 REPL 体验的信息。所有自定义宏都喜欢defalias
并且immigrate
基本上与def
上面的形式等效(可能使用intern
和/或调用方法来重置目标 Vars 的根绑定),同时注意传输元数据;你可以选择你最喜欢的一个并使用它。
请注意,目标 Vars 与源 Vars 完全分离,并且可以例如使用binding
if 标记单独反弹:dynamic
,给定不同的根值等。