gpt4 book ai didi

clojure - 创建另一个 Clojure 命名空间的别名

转载 作者:行者123 更新时间:2023-12-02 10:34:37 25 4
gpt4 key购买 nike

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

(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 的依赖项,并且由于我们不能有循环依赖关系,因此定义 foo 是行不通的。 two内本身。 two是公共(public) API,所以 foo需要公开属于two命名空间。

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

最佳答案

这个怎么样:

(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”,从而避免触发其元数据上的私有(private)标志。然后,在第二个命名空间中为 foo 添加别名后,您只需从先前的定义中挑选要保留的元数据即可。

关于clojure - 创建另一个 Clojure 命名空间的别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11735970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com