私人def in clojure/clojurescript

Zub*_*air 57 clojure clojurescript

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

jua*_*rro 81

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

(def ^{:private true} some-var :value)
;; or
(def ^:private some-var :value)
Run Code Online (Sandbox Code Playgroud)

第二种形式只是第一种形式的简写.


Mik*_*Mik 18

值得一提的是,目前在ClojureScript中不可能有私有def(和defn):https://clojurescript.org/about/differences (在"特殊表格"下)

编译不会失败,但def仍然可以访问.


Tom*_*ilt 15

如果你想要一个def-,这是如何实现它

(defmacro def- [item value]
  `(def ^{:private true} ~item ~value)
)
Run Code Online (Sandbox Code Playgroud)

  • 这实际上不起作用,请参阅此主题以获取解释https://groups.google.com/forum/#!topic/clojure/O7xWh72zzuo.正确的宏是`(defmacro def- [sym init] \`(def~(with-meta sym {:private true})~init))` (7认同)

lee*_*eor 9

此google小组帖子讨论了此主题.显然,该请求已被考虑.根据其中一个回复,defn-被认为不是一个好主意,并决定不def与其他人保持一致.


Joh*_*ohn 5

实施方法def-如下:

(defmacro def-
  "same as def, yielding non-public def"
  [name & decls]
  (list* `def (with-meta name (assoc (meta name) :private true)) decls))
Run Code Online (Sandbox Code Playgroud)

这段代码与的代码非常相似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))
Run Code Online (Sandbox Code Playgroud)