Clojure 中的 defn- 和 defn ^:private 有什么区别?

Eoi*_*ing 2 clojure defn ring

两者似乎都表示私有函数,类似于大多数 OOP 语言中的私有函数。是否存在功能差异或者只是语法糖?

我见过 defn ^:private 在环应用程序的处理程序上下文中使用。

Sea*_*eld 5

回答原来的问题:没有区别。

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 truename