Clojure (x)与(fn[&;ux]有何不同?
根据我的项目运行的“模式”(它是一个api服务器,应该能够在Clojure (x)与(fn[&;ux]有何不同?,clojure,expression-evaluation,Clojure,Expression Evaluation,根据我的项目运行的“模式”(它是一个api服务器,应该能够在:dev,:prod模式等)中运行),我使用了一种多方法来提供不同的功能 我使用提供一个关键字: (解除状态模式:开始:开发) 当我使用(持续模式)进行调度时,我会收到错误,但当我使用(fn[&_]模式)进行调度时,它似乎可以工作 这两种形式不一样吗?或者在评估它们的方式(或时间)上是否存在细微差异?中,如果尚未开始状态,则它们的值是derefabelstate对象 通过调用,首先计算模式的值,然后使用该值不断调用函数。这意味着,当您
:dev
,:prod
模式等)中运行),我使用了一种多方法来提供不同的功能
我使用提供一个关键字:
(解除状态模式:开始:开发)
当我使用(持续模式)
进行调度时,我会收到错误,但当我使用(fn[&_]模式)
进行调度时,它似乎可以工作
这两种形式不一样吗?或者在评估它们的方式(或时间)上是否存在细微差异?中,如果尚未开始状态,则它们的值是derefabelstate
对象
通过调用,首先计算模式
的值,然后使用该值不断调用函数。这意味着,当您不断地调用的结果时,它将始终返回参数constantive,尽管事实上您已经更改了它。如果在不断调用之前未启动状态
,则它将存储DerefableObject
另一方面,使用(fn[&_]mode)
每次调用函数时,都会计算mode
var的值。如果您尚未启动状态,则它也将返回一个DerefableState
,但如果您已启动状态,则结果将是预期的关键字
一个简单的解决方案是将分派函数也置于一种状态
(defstate dispatch :start (constantly state))
我认为另一种解释是,你可以用副作用来强调区别是什么
比较:
(def const-f (constantly (println "Hello!")))
Hello!
=> #'user/const-f
(def fn-f (fn [] (println "World!")))
=> #'user/fn-f
只需执行第一个def
causesHello代码>将被打印,因为的主体会不断地
立即被评估。但是,第二个def
不打印任何内容,因为未对fn
的主体进行求值
但在给他们打电话时:
(const-f)
=> nil ; Prints nothing. Just evaluates to what println returned
(fn-f)
World! ; Prints now,
=> nil ; then returns what println evaluates to
不是宏,因此必须首先计算它的参数<但是,code>fn
是一个宏,因此它在计算其参数之前运行 请添加错误谢谢,很好的解释。如果说表单在编译时持续关闭模式
,是否正确,而fn
表单在运行时评估模式
?不断地关闭模式
,而不是在编译时,而是在运行时调用它的时间。我试着像您建议的那样将调度置于解除状态
,但是我无法从(defmulti-fn-name-dispatch)
行将mount.core.derefabelstate转换为clojure.lang.IFn
。我想我明白为什么会这样。我误解了你的建议吗?嗯,这取决于你如何使用dispatch
,但可能与上面相同:你在装载开始之前使用它的值。尝试使用#分派
而不是分派
也许吧?我选择了一种半解决方法: