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?
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.
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.
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)
)
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.
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))
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