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

Dmi*_*yev 4 clojure environment-variables leiningen

我有这段代码:

(def heavy_computation (f1 (env :var1)))
Run Code Online (Sandbox Code Playgroud)

在哪里(env :var1)获取指向目录位置的环境变量VAR1(在environ的帮助下)并且f1是Java函数的包装器.稍后在函数中使用它,我只想计算一次计算量很大.

我希望能够VAR1在生产中缺少自定义和打印错误消息.

如果我在lein uberjar没有环境变量的情况下编译此代码,则会NullPointerException在此行引发错误.

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

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

Tay*_*ood 7

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

(def heavy-computation (delay (f1 (env :var1))))
Run Code Online (Sandbox Code Playgroud)

那么无论你需要的结果,你可以deref/ @延迟:

(when (= :ok @heavy-computation)
  (println "heavy!"))
Run Code Online (Sandbox Code Playgroud)

delay的身体只会计算一次,而不是直到你取消对它的引用.