gpt4 book ai didi

clojure - 在运行时设置 Clojure "constants"

转载 作者:行者123 更新时间:2023-12-03 00:36:24 25 4
gpt4 key购买 nike

我有一个 Clojure 程序,我使用 Maven 将其构建为 JAR 文件。 JAR list 中嵌入的是构建版本号,包括构建时间戳。

我可以使用以下代码在运行时从 JAR list 轻松读取此内容:

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

但有人告诉我,在 defn 中使用 def 是一种恶业。

在运行时设置常量的 Clojure 惯用方法是什么?显然,我没有将构建版本信息作为 def 嵌入到我的代码中,但我希望它在 main 函数中设置一次(并且一劳永逸)程序开始。然后它应该可以作为其余正在运行的代码的 def 使用。

更新:顺便说一句,Clojure 一定是我一段时间以来遇到的最酷的语言之一。向里奇·希基致敬!

最佳答案

我仍然认为最简洁的方法是在应用程序的 main 方法中使用 alter-var-root

(declare version)

(defn -main
[& args]
(alter-var-root #'version (constantly (-> ...)))
(do-stuff))

它在编译时声明 Var,在运行时设置其根值一次,不需要 deref 并且不绑定(bind)到主线程。您在上一个问题中没有回应此建议。您尝试过这种方法吗?

关于clojure - 在运行时设置 Clojure "constants",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3997910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com