Ich habe ein Clojure-Programm, das ich mit Maven als JAR-Datei erstelle. Eingebettet in das JAR-Manifest ist eine Build-Versionsnummer, einschließlich des Build-Zeitstempels.
Ich kann dies zur Laufzeit aus dem JAR-Manifest mit dem folgenden Code lesen:
%Vor% Aber mir wurde gesagt, dass es schlechtes Karma ist, def
in defn
zu verwenden.
Was ist der Clojure-idiomatische Weg, um zur Laufzeit eine Konstante zu setzen? Ich habe natürlich nicht die Build-Version Informationen in meinem Code als def
einbetten, aber ich würde es gerne einmal (und für alle) von der main
-Funktion gesetzt, wenn das Programm startet. Es sollte dann als def
für den Rest des laufenden Codes verfügbar sein.
UPDATE : Übrigens, Clojure muss eine der coolsten Sprachen sein, auf die ich seit einiger Zeit gestoßen bin. Kudos an Rich Hickey!
Ich denke immer noch, dass der sauberste Weg darin besteht, alter-var-root
in der Methode main
Ihrer Anwendung zu verwenden.
Er deklariert den Var zur Kompilierzeit, setzt seinen Root-Wert zur Laufzeit einmal, benötigt keine Deref und ist nicht an den Haupt-Thread gebunden. Sie haben auf diesen Vorschlag in Ihrer vorherigen Frage nicht geantwortet. Hast du diesen Ansatz versucht?
Sie könnten dynamische Bindung verwenden.
%Vor% Jetzt main
und jede aufgerufene Funktion sieht den Wert von *version*
.
Während die Lösung von kotarak sehr gut funktioniert, ist hier ein alternativer Ansatz: Verwandle deinen Code in eine Memo-Funktion, die die Version zurückgibt. Wie so:
%Vor%Ich hoffe, ich vermisse diesmal nichts.
Wenn die Version eine Konstante ist, wird sie einmal definiert und wird nicht geändert. Sie können das defn einfach entfernen und die (def Version ...) in Ruhe lassen. Ich nehme an, du willst das aus irgendeinem Grund nicht.
Wenn Sie globale Variablen in einem fn ändern möchten, ist es meiner Meinung nach die idiomatische Methode, einige der Parallelitätskonstrukte zu verwenden, um die Daten zu speichern und auf sichere Weise darauf zuzugreifen und sie zu ändern Zum Beispiel:
%Vor%