Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure (x)与(fn[&;ux]有何不同?_Clojure_Expression Evaluation - Fatal编程技术网

Clojure (x)与(fn[&;ux]有何不同?

Clojure (x)与(fn[&;ux]有何不同?,clojure,expression-evaluation,Clojure,Expression Evaluation,根据我的项目运行的“模式”(它是一个api服务器,应该能够在:dev,:prod模式等)中运行),我使用了一种多方法来提供不同的功能 我使用提供一个关键字: (解除状态模式:开始:开发) 当我使用(持续模式)进行调度时,我会收到错误,但当我使用(fn[&_]模式)进行调度时,它似乎可以工作 这两种形式不一样吗?或者在评估它们的方式(或时间)上是否存在细微差异?中,如果尚未开始状态,则它们的值是derefabelstate对象 通过调用,首先计算模式的值,然后使用该值不断调用函数。这意味着,当您

根据我的项目运行的“模式”(它是一个api服务器,应该能够在
: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
causes
Hello将被打印,因为
的主体会不断地
立即被评估。但是,第二个
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
,但可能与上面相同:你在装载开始之前使用它的值。尝试使用
#分派
而不是
分派
也许吧?我选择了一种半解决方法: