2012-07-31 76 views
5

我在一个名称空间中有一些私有函数,我希望将其包含在第二个名称空间中。例如创建另一个Clojure命名空间的别名

(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 

理想情况下,我想保存的文档字符串,所以我不必须保持它在两个地方。此外,我想要选择使用相同的名称或不同的名称。

此要求的原因如下:在名称空间one中需要/使用该功能。 onetwo的依赖项,并且由于我们不能具有循环依赖性,因此它不会在two本身内定义footwo是公共API,因此foo需要公开地为two命名空间的一部分。

达到此目的的最佳方法是什么?

+0

你想别名是相同的,或者它可以是任何东西? – Ankur 2012-07-31 08:38:37

+0

@Ankur - 目前正在寻找使用相同的名称,但在某些情况下,使用不同的名称创建别名可能也很有用,所以如果解决方案允许的话,这将非常有用。 – mikera 2012-07-31 08:40:22

+0

试试这个:'(def foo(with-meta one/foo(meta#'one/foo)))' – Ankur 2012-07-31 08:44:26

回答

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])) 

诀窍是不能解决符号“一个/ foo的,从而避免触发私人标志上它的元数据。然后,在你的第二个命名空间中使用foo之后,你只需选择你想要从前一个定义中保留的元数据。