clojure/clojurescript中的私有def

clojure/clojurescript中的私有def,clojure,clojurescript,Clojure,Clojurescript,在Clojure和clojurescript中,您可以有一个名为defn-的defn私有版本,但如何对def执行相同的操作,因为def-似乎没有包含在内?您必须添加:private true元数据键值对 (def ^{:private true} some-var :value) ;; or (def ^:private some-var :value) 第二个表单只是第一个表单的简写。如果您想要一个def-,下面介绍如何实现它 (defmacro def- [item value] `(

在Clojure和clojurescript中,您可以有一个名为defn-的defn私有版本,但如何对def执行相同的操作,因为def-似乎没有包含在内?

您必须添加
:private true
元数据键值对

(def ^{:private true} some-var :value)
;; or
(def ^:private some-var :value)

第二个表单只是第一个表单的简写。

如果您想要一个def-,下面介绍如何实现它

(defmacro def- [item value]
  `(def ^{:private true} ~item ~value)
)

值得一提的是,目前在ClojureScript:“特殊形式”下不可能有私有的
def
(和
defn


编译不会失败,但是
def
将保持可访问性。

这个谷歌小组讨论了这个话题。显然,这项请求已得到考虑。根据其中一个回复,
defn-
被认为不是一个好主意,并决定不与
def
和其他人一起将其永久化。

以下是如何实施
def-

(defmacro def-
  "same as def, yielding non-public def"
  [name & decls]
  (list* `def (with-meta name (assoc (meta name) :private true)) decls))
此代码与
defn-
的代码非常相似,您可以使用
(clojure.repl/source defn-
)查找此代码:


这实际上不起作用,请参阅此线程以获取解释。正确的宏是
(defmacro def-[sym init]`(def~(with meta-sym{:private-true})~init))
@ark这样更好,但不支持docstring。有关与
defn-
几乎相同的实现,请参阅。我从链接帖子中得到的信息是
clojure.core
不是
defn-
的位置,也不是说
defn-
一点都不好+但是,1个链接到了帖子
(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))