У меня есть программа Clojure, которую я создаю как файл JAR с использованием Maven. Встроенный в JAR Manifest - это номер версии сборки, включая метку времени сборки.Установка констант Clojure во время выполнения
можно легко прочитать во время выполнения из 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
для остальной части кода.
ОБНОВЛЕНИЕ: BTW, Clojure должен быть одним из самых крутых языков, с которыми я столкнулся довольно долго. Престижность Рику Хики!
Я не пробовал, но буду. Это выглядит интересно. Отсутствие штрафа за производительность после установки значения. Я также могу использовать этот метод для установки значений из параметров командной строки - нужно установить только один раз. – Ralph