Clojure 的 def 语句中使用的环境变量

Environment variables used in `def` statements in Clojure

我有这段代码:

(def heavy_computation (f1 (env :var1)))

其中 (env :var1) 正在获取指向目录位置的环境变量 VAR1(在 environ 的帮助下),f1 是 [=32 的包装器=] 功能。这稍后会在函数中使用,这是繁重的计算,我只想计算一次。

我希望能够自定义 VAR1 并在生产中缺少它时打印错误消息。

如果我在没有环境变量的情况下编译这段代码 lein uberjar,它会在这一行抛出关于 NullPointerException 的错误。

我可以用环境变量编译它,稍后如果我适当地设置它们,它就会工作。为了在错误消息丢失的情况下打印我的错误消息,我必须将检查它的代码放在 def 语句之前,否则它会抛出空指针异常。

我可以用更简洁的方式来做吗?我不想设置环境变量来编译它,我想在启动服务器之前将执行检查的代码放在 -main 函数中。

一个选项是将评估包装在 delay:

(def heavy-computation (delay (f1 (env :var1))))

然后在任何你需要结果的地方,你可以deref/@延迟:

(when (= :ok @heavy-computation)
  (println "heavy!"))

delay 的主体只会被评估一次,直到您取消引用它。

将环境值包装在 if-let 中,并通过打印警告来处理 else 分支。在编译期间你会看到警告,但我个人认为这没问题。您还可以使用记忆函数而不是延迟来延迟计算。