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
和有用的
都是使用宏来实现的。。。但我不明白他们做了什么。