(常数x)与(fn [&_] x)有何不同?

Jer*_*eld 3 clojure expression-evaluation

我正在使用多方法提供不同的功能,具体取决于我的项目运行的"模式"(它是一个yada api服务器,应该能够运行:dev,:prod模式等).

我正在使用mount/defstate提供关键字:

(defstate mode :start :dev)
Run Code Online (Sandbox Code Playgroud)

当我发送使用时(constantly mode),我得到错误但是当我使用(fn [& _] mode)它发送时似乎工作.

这两种形式不一样吗?或者评估它们的方式(或时间)是否存在细微差别?

erd*_*dos 5

mount中如果尚未启动状态,那么它们的值就是DerefableState对象.

通过不断调用,首先评估值,mode然后constantly使用值调用函数.这意味着当你调用constantly它的结果时,它将始终返回参数,尽管你已经改变了它.如果你在打电话之前没有开始你的状态constantly那么它会存储DerefableObject.

另一方面,每次调用函数时都要(fn [& _] mode)评估modevar 的值.如果你还没有开始状态,那么它也会返回a DerefableState但是如果你有,那么结果将是预期的关键字.

一个简单的解决方案是将调度功能也置于一个状态.

(defstate dispatch :start (constantly state))
Run Code Online (Sandbox Code Playgroud)