Clojure-Konstanten zur Laufzeit setzen

Ich habe ein Clojure-Programm, das ich mit Maven als JAR-Datei erstellt habe. In das JAR-Manifest ist eine Build-Versionsnummer eingebettet, einschließlich des Build-Zeitstempels.

Ich kann dies zur Laufzeit leicht aus dem JAR-Manifest lesen, indem ich den folgenden Code verwende:

(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"))))

aber mir wurde gesagt, dass es schlechtes Karma ist, @ zu benutzdef Innerhalbdefn.

Was ist die Clojure-idiomatische Methode, um zur Laufzeit eine Konstante festzulegen? Ich habe offensichtlich nicht die Build-Versionsinformationen, um sie als @ in meinen Code einzubettedef, aber ich möchte es ein für allemal aus dem @ setzmain -Funktion beim Programmstart. Es sollte dann als @ verfügbar sedef zum Rest des laufenden Codes.

AKTUALISIERE: Übrigens, Clojure muss eine der coolsten Sprachen sein, die mir seit einiger Zeit begegnet sind. Ein großes Lob an Rich Hickey!

Antworten auf die Frage(8)

Ihre Antwort auf die Frage