在 Clojure 和 clojurescript 中,您可以拥有一个名为 defn-的 defn 私有版本,但是如何对 def 做同样的事情,因为 def-似乎没有包含在内?
必须添加 :private true元数据键值对。
: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仍然可以访问。
这个谷歌组 邮寄有一个关于这个主题的讨论。显然这个要求已经被考虑过了。根据其中一份答复,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-)查找:
(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))