两者似乎都表示私有函数,类似于大多数 OOP 语言中的私有函数。是否存在功能差异或者只是语法糖?
我见过 defn ^:private 在环应用程序的处理程序上下文中使用。
回答原来的问题:没有区别。
user=> (defn- a1 [b] b)
#'user/a1
user=> (defn ^:private a2 [b] b)
#'user/a2
user=> (meta #'a1)
{:private true, :arglists ([b]), :line 1, :column 1, :file "NO_SOURCE_PATH", :name a1, :ns #object[clojure.lang.Namespace 0xbaf1bb3 "user"]}
user=> (meta #'a2)
{:private true, :arglists ([b]), :line 1, :column 1, :file "NO_SOURCE_PATH", :name a2, :ns #object[clojure.lang.Namespace 0xbaf1bb3 "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=>
Run Code Online (Sandbox Code Playgroud)
正如我们从源头看到的,它的功能与添加到符号中的元数据defn-
相同。defn
:private true
name