Перегруженная приватная функция, которая приватна в clojure

Обычно у меня одинаковая структура моих функций:

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

И обычно только один из этих вариантов public, Но, как вы можете видеть из моей записи - все мои функции public из-за использования defn вместо defn-, Но defn- скрыть все функции, включая все перегруженные.

Есть ли способ "спрятать" только часть перегруженной функции?

Например, я хочу скрыть func-имя с арностью одного и двух аргументов.

Ofcorse я могу скрыть перегруженную функцию внутри одной defn как это:

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

Но я думаю, что это немного грязно, и я уверен, что должен быть способ решить это.

Спасибо!

1 ответ

Решение

Как я знаю, эта видимость определяется :private флаг в вар meta, Итак, эти два выражения равны:

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

Поэтому я думаю, что вы можете контролировать видимость только в целом var,

Я могу предложить использовать разные имена функций для публичного и частного пространства. Т.е. func-name для общественности и func-name- для частного.

Другие вопросы по тегам