Clojure/clojurescript 中的私人辩护

在 Clojure 和 clojurescript 中,您可以拥有一个名为 defn-的 defn 私有版本,但是如何对 def 做同样的事情,因为 def-似乎没有包含在内?

16945 次浏览

必须添加 :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: https://clojurescript.org/about/differences(在“特殊表单”下)中不可能有私有的 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 defn-
"same as defn, yielding non-public def"
{:added "1.0"}
[name & decls]
(list* `defn (with-meta name (assoc (meta name) :private true)) decls))