Tengo un programa Clojure que construyo como un archivo JAR utilizando Maven. Embebido en el Manifiesto JAR es un número de versión de compilación, que incluye la marca de tiempo de compilación.Configuración de Clojure "constantes" en el tiempo de ejecución
puedo leer fácilmente esto en tiempo de ejecución de la jarra manifiesto mediante el siguiente código:
(defn set-version
"Set the version variable to the build number."
[]
(def version
(-> (str "jar:" (-> my.ns.name (.getProtectionDomain)
(.getCodeSource)
(.getLocation))
"!/META-INF/MANIFEST.MF")
(URL.)
(.openStream)
(Manifest.)
(.. getMainAttributes)
(.getValue "Build-number"))))
pero me han dicho que es un mal karma a utilizar def
dentro defn
.
¿Cuál es la forma idiomática de Clojure para establecer una constante en el tiempo de ejecución? Obviamente no tengo la información de la versión de compilación para incrustar en mi código como def
, pero me gustaría configurarlo una vez (y para todos) desde la función main
cuando se inicia el programa. Debería estar disponible como def
en el resto del código de ejecución.
ACTUALIZACIÓN: Por cierto, Clojure tiene que ser uno de los mejores idiomas que he encontrado en mucho tiempo. ¡Felicitaciones a Rich Hickey!
No lo he probado, pero lo haré. Se ve interesante. Sin penalización de rendimiento una vez que se establece el valor. También puedo usar esta técnica para establecer valores desde las opciones de línea de comandos; necesito establecer solo una vez. – Ralph