在 clojure 中私有的重载私有函数

overloaded private function which is private in clojure

通常我的函数结构相同:

(defn func-name
  ([] (some actions))
  ([ar] (some actions))
  ([ar aar] (some actions)))

而且通常只有一个变体是 public。但是正如您从我的条目中看到的那样——我所有的函数都是 public,因为使用 defn 而不是 defn-。但是defn-隐藏了所有函数,包括所有重载的。

有什么方法可以'hide'只重载函数的一部分吗?

例如,我想隐藏一个包含一个和两个参数的函数名。

当然我可以像这样在 defn 中隐藏重载函数:

(defn awesome[]
  (let [func (fn some-func ([] (some actions))
               ([ar] (some actions)))]
    (func)))

但我觉得有点乱,我相信一定有办法解决它。

谢谢!

据我所知,此可见性由 var 的 meta 中的 :private 标志定义。所以这两个表达式相等:

(defn ^:private foo [] "bar")
(defn- foo [] "bar")

所以我认为你只能控制整个var的可见性。

我可以建议为 public 和私有空间使用不同的函数名称。即 func-name 代表 public 一个,func-name- 代表私人。