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

Clojure 一个命名空间中的函数如何包含在另一个命名空间中?,clojure,Clojure,我在一个名称空间中定义了一个函数 (ns package.sub) (defn func1[]....) 我希望将其包含在另一个命名空间中(ns package.main) 这样我就可以从另一个库中使用它: (ns app.core (:use [package.main :only [func1])) 最简单的方法是什么?我认为一般鼓励用户只需要函数实际所在的名称空间,尽管正如您所指出的,有些库仍然“重新导出”变量。重新导出可能存在问题的主要原因是Clojure中没有实际的重新导出—

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

(ns package.sub)

(defn func1[]....)
我希望将其包含在另一个命名空间中<代码>(ns package.main)

这样我就可以从另一个库中使用它:

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

最简单的方法是什么?

我认为一般鼓励用户只需要函数实际所在的名称空间,尽管正如您所指出的,有些库仍然“重新导出”变量。重新导出可能存在问题的主要原因是Clojure中没有实际的重新导出——您将得到单独的变量,这些变量恰好共享相同的根值(请参见本答案的结尾)

如果您坚持从
package.main
导出函数,但在
package.sub
中定义它,您只需创建一个变量将其保存在
package.main

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

(def foo sub/foo)
这有一个缺点,就是不将元数据传输到新的Var,这在本用例中是不幸的,因为
defn
-引入的Var上的元数据包含用于支持愉快的REPL体验的信息。所有自定义宏,如
defalias
immigrate
基本上与上面的
def
表单相同(可能使用
intern
和/或调用方法重置目标变量的根绑定),同时注意传输元数据;你可以选择你最喜欢的并使用它


请注意,目标变量与源变量完全独立,例如,如果标记为
:dynamic
,则可能会使用
绑定单独反弹,给定不同的根值等。

可能我遗漏了一些内容,但不只是从它所在的包中使用它(:使用[package.sub:only[func1])?我的意思是,要么将名称空间更改为main,要么将函数移动……它基本上是为最终用户打包所有内容
midje
有用的
都是使用宏来实现的。。。但我不明白他们做了什么。