在 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)
并且这是 get
的 not-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
.
相同
为什么表达式
('+ 10 20)
评估为 20
?这对我来说真的很奇怪!我本以为会出错,因为列表的第一个元素 '+
i 不是可以评估的东西!
这几乎是 Clojure 的常见问题解答,无论好坏。因此 '+
是 shorthand 对于 (quote +)
其计算结果为符号 +
。符号(和关键字)可以被视为函数并在它们的参数中查找它们自己,所以 ('+ 10 20)
本质上是 (get 10 '+ 20)
并且这是 get
的 not-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
.