在 clojure 中引用第一个参数的列表的值是最后一个参数?

Sid*_*hat 2 clojure

为什么表达

('+ 10 20)
Run Code Online (Sandbox Code Playgroud)

评估为20? 这对我来说真的很奇怪!我本来希望给出一个错误,因为列表的第一个元素,'+我不是一个可以评估的东西!

Sea*_*eld 8

这几乎是 Clojure 的常见问题解答,无论好坏。对符号 求值的'+简写也是如此。符号(和关键字)可被视为功能,并期待自己在他们的说法,所以基本上,这就是的元数,所以如果在“收藏”不包括符号那么它将返回第三个参数,。(quote +)+('+ 10 20)(get 10 '+ 20)not-foundget10'+20

您可能希望关联查找10失败并抛出异常,但在 Clojure 中有很多情况会返回查找nil(或not-found版本),因为从nil双关语的角度来看它是有益的,并且是导致惯用 Clojure 的一部分。

一些函数确实执行那种参数检查:(contains? 10 '+)例如,将抛出异常,而两者(get 10 '+)(get '+ 10)都将返回nil

可能还值得注意的是,以下抛出异常:

user=> ('+ 10 20 30)
Execution error (ArityException) at user/eval39476 (REPL:1).
Wrong number of args (3) passed to: clojure.lang.Symbol
Run Code Online (Sandbox Code Playgroud)

您询问“clojure 中带引号的第一个参数的列表的值是否是最后一个参数”,答案是否定的,这是一个非常具体的双参数函数调用,因为上述逻辑:您不能“调用”带有 3 个参数的符号,只有 1 或 2。

值得注意的是这里对于 0 args 情况的区别:

user=> ('+)
Execution error (ArityException) at user/eval39478 (REPL:1).
Wrong number of args (0) passed to: clojure.lang.Symbol
user=> (+)
0
Run Code Online (Sandbox Code Playgroud)

第一种情况是符号查找——它至少需要一个集合来查找自身——而第二种情况是clojure.core/+具有零参数的函数调用(of ),它+以与(*)返回相同的方式返回标识值1