clojure/clojurescript中的私有def
在Clojure和clojurescript中,您可以有一个名为defn-的defn私有版本,但如何对def执行相同的操作,因为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] `(
: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))