1

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

(ns package.sub)

(defn func1[]....)

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

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

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

最简单的方法是什么?

4

1 回答 1

3

我相信通常鼓励用户只需要函数实际所在的命名空间,尽管正如您指出的那样,一些库仍然会“重新导出”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 完全分离,并且可以例如使用bindingif 标记单独反弹:dynamic,给定不同的根值等。

于 2013-05-24T02:45:22.770 回答