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



我有一段代码:

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

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

我希望能够自定义VAR1,并在生产中丢失时打印错误消息。

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

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

我能用更干净的方式做吗?我不想为了编译它而设置环境变量,我想在-main函数启动服务器之前将执行检查的代码放在函数中。

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

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

然后,无论你在哪里需要结果,你都可以deref/@延迟:

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

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

将环境值包装在iflet中,并通过打印警告来处理else分支。在编译过程中,你会看到警告,但这对我个人来说是可以的。您也可以使用记忆函数而不是延迟来推迟计算。

最新更新