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 分支。在编译期间你会看到警告,但我个人认为这没问题。您还可以使用记忆函数而不是延迟来延迟计算。
我有这段代码:
(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 分支。在编译期间你会看到警告,但我个人认为这没问题。您还可以使用记忆函数而不是延迟来延迟计算。