Clojure "Konstanten" zur Laufzeit setzen

8

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!

    
Ralph 22.10.2010, 14:42
quelle

4 Antworten

7

Ich denke immer noch, dass der sauberste Weg darin besteht, alter-var-root in der Methode main Ihrer Anwendung zu verwenden.

%Vor%

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?

    
kotarak 23.10.2010, 20:48
quelle
4

Sie könnten dynamische Bindung verwenden.

%Vor%

Jetzt main und jede aufgerufene Funktion sieht den Wert von *version* .

    
Brian Carper 22.10.2010 19:59
quelle
2

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%     
Siddhartha Reddy 05.11.2010 16:31
quelle
1

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%     
jneira 22.10.2010 18:22
quelle

Tags und Links