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

Value of a list with quoted first argument in clojure is the last argument?

为什么表达式

('+ 10 20)

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

这几乎是 Clojure 的常见问题解答,无论好坏。因此 '+ 是 shorthand 对于 (quote +) 其计算结果为符号 +。符号(和关键字)可以被视为函数并在它们的参数中查找它们自己,所以 ('+ 10 20) 本质上是 (get 10 '+ 20) 并且这是 getnot-found arity 所以如果“ collection" 10 不包含符号 '+ 那么它将 return 第三个参数 20.

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

一些函数 do 执行那种参数检查:例如 (contains? 10 '+) 将抛出异常,而 (get 10 '+)(get '+ 10) 都会 return nil.

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

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

您询问“在 clojure 中引用第一个参数的列表的值是否是最后一个参数”,答案是否定的,这是非常具体的 two-argument 函数调用,因为上述逻辑:你不能用 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

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

相同