Если отвечать на исходный вопрос: они эквивалентны.
user=> (defn- first_fn [value] value)
#'user/first_fn
user=> (defn ^:private second_fn [value] value)
#'user/second_fn
user=> (meta #'first_fn)
{:private true, :arglists ([value]), :line 1, :column 1, :file "NO_SOURCE_PATH", :name first_fn, :ns #object[clojure.lang.Namespace 0xcaf2cc4 "user"]}
user=> (meta #'second_fn)
{:private true, :arglists ([value]), :line 1, :column 1, :file "NO_SOURCE_PATH", :name second_fn, :ns #object[clojure.lang.Namespace 0xcaf2cc4 "user"]}
user=> (source defn-)
(defmacro defn-
"same as defn, yielding non-public def"
{:added "1.0"}
[name & decls]
(list* `defn (with-meta name (assoc (meta name) :private true)) decls))
nil
user=>
Из реализации defn- видно, что он ведёт себя точно как defn, к символу name которого добавлены метаданные :private true.
Переведено с английского·Показать оригиналTo address what was asked originally: they are equivalent.
user=> (defn- first_fn [value] value)
#'user/first_fn
user=> (defn ^:private second_fn [value] value)
#'user/second_fn
user=> (meta #'first_fn)
{:private true, :arglists ([value]), :line 1, :column 1, :file "NO_SOURCE_PATH", :name first_fn, :ns #object[clojure.lang.Namespace 0xcaf2cc4 "user"]}
user=> (meta #'second_fn)
{:private true, :arglists ([value]), :line 1, :column 1, :file "NO_SOURCE_PATH", :name second_fn, :ns #object[clojure.lang.Namespace 0xcaf2cc4 "user"]}
user=> (source defn-)
(defmacro defn-
"same as defn, yielding non-public def"
{:added "1.0"}
[name & decls]
(list* `defn (with-meta name (assoc (meta name) :private true)) decls))
nil
user=>
Examining the implementation of defn- shows it behaves exactly like defn after attaching :private true metadata to the name symbol.