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

时间:2018-08-05 07:58:34

标签: clojure environment-variables leiningen

我有这段代码:

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

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

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

如果我在不使用环境变量的情况下编译此代码lein uberjar,则会在此行引发关于NullPointerException的错误。

我可以用环境变量编译它,以后如果适当设置它们,它将起作用。为了在错误消息丢失时打印我的错误消息,我必须将检查错误消息的代码放在def语句之前,否则它将引发空指针异常。

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

2 个答案:

答案 0 :(得分:7)

一种选择是将评估结果包装在delay中:

deref

然后,无论您在哪里需要结果,都可以@ / (when (= :ok @heavy-computation) (println "heavy!")) 进行延迟:

delay

{{1}}的正文仅会被评估一次,直到您取消引用为止。

答案 1 :(得分:2)

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