Установка «констант» Clojure во время выполнения

У меня есть программа Clojure, которую я создаю как файл JAR с помощью Maven. В манифест JAR встроен номер версии сборки, включая отметку времени сборки.

Я могу легко прочитать это во время выполнения из манифеста JAR, используя следующий код:

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

но мне сказали, что это плохая карма использовать def внутри defn .

Каким идиоматическим способом Clojure является установка константы во время выполнения? Очевидно, что у меня нет информации о версии сборки, которую можно было бы встроить в мой код как def , но я бы хотел, чтобы она была установлена ​​один раз (и навсегда) из функции main , когда программа начинается. Затем он должен быть доступен как def для остальной части работающего кода.

ОБНОВЛЕНИЕ : Кстати, Clojure должен быть одним из самых крутых языков, с которыми я когда-либо сталкивался. Слава Ричу Хики!

9
задан Ralph 22 October 2010 в 14:42
поделиться