3

Обычно у меня такая же структура моих функций: перегружен частная функция, которая является частным в 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))) 

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

Спасибо!

ответ

3

Как я знаю, эта видимость определяется по знаку :private в var's meta. Таким образом, эти два выражения равны:

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

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

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

+0

Это не работает - функция таким образом я назвал штрафом. Может быть, я использовал мета-информацию не в правильном направлении? Посмотрите на мой UPD1. –

+1

Вы меня не поняли :). Я хотел сказать, что вы не можете это сделать. Не добавляя мета к вашим выражениям – fl00r

+0

О, мне интересно, почему, но все равно, спасибо в любом случае. –

Смежные вопросы