5

我在一个命名空间中有一些私有函数,我想将它们包含在第二个命名空间中。例如

(ns one)

(defn ^:private foo 
  "A docstring"
  [x] (* x 2))

第二个命名空间需要为此创建一个别名:

(ns two)

(def foo ???)

(foo 3)   ;; should work as if the function in namespace one was called
=> 6

理想情况下,我想保留文档字符串,这样我就不必在两个地方维护它。此外,我希望可以选择使用相同的名称或不同的名称。

此要求的原因如下:在 namespace 中需要/使用该功能oneone是 的依赖项two,并且由于我们不能有循环依赖项,因此无法在其foo内部定义twotwo是公共 API,因此foo需要成为two命名空间的公共部分。

实现这一目标的最佳方法是什么?

4

2 回答 2

5

这个怎么样:

(ns one)

(defn- foo 
  "A docstring"
  [x] (* x 2))

(ns two)

(def foo-alias #'one/foo)
(alter-meta! #'foo-alias merge (select-keys (meta #'one/foo) [:doc :arglists]))

诀窍是不解析符号'one/foo,从而避免触发其元数据上的私有标志。然后在您的第二个命名空间中为 foo 起别名后,您只需从先前的定义中挑选您想要保留的元数据。

于 2012-10-28T15:31:04.413 回答
0

Potemkin 库有这种功能import-vars

https://github.com/ztellman/potemkin

于 2014-02-21T14:41:29.473 回答