Private def en clojure / clojurescript


En Clojure y clojurescript puedes tener una versión privada de defn llamada defn-, pero ¿cómo haces lo mismo con def, ya que def - no parece estar incluido?

Author: Zubair, 2013-12-07

5 answers

Debe agregar el par de valores de clave de metadatos :private true.

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

La segunda forma es solo una mano corta para la primera.

 69
Author: juan.facorro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-07 16:29:17

Vale la pena mencionar, que actualmente no es posible tener un privado def (y defn) en ClojureScript: https://clojurescript.org/about/differences (bajo "formas especiales")

La compilación no fallará, pero def permanecerá accesible.

 15
Author: Mikhail D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-15 12:39:50

Si desea un def -, aquí está cómo implementarlo

(defmacro def- [item value]
  `(def ^{:private true} ~item ~value)
)
 12
Author: palfrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-03 12:51:09

Este grupo de google post tiene una discusión sobre este tema. Aparentemente la solicitud ha sido considerada. Según una de las respuestas, defn- se consideró que no era una buena idea y decidió no perpetuarla con def y otros.

 6
Author: leeor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-17 18:26:39

He aquí cómo implementar def-:

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

Este código es muy similar al de defn-, que puedes buscar usando (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))
 2
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-22 15:23:05