Clojure:列表和返回列表的函数之间的区别

Clojure:列表和返回列表的函数之间的区别,clojure,Clojure,我是个新手。我试图理解为什么第二种形式不起作用: 第一种形式: user=>(def nums(range 3)) (0 1 2) user=>(map #(list %1) nums) ((0) (1) (2)) 第二种形式: user=> (map #(list %1) (0 1 2)) java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn (NO_SOURC

我是个新手。我试图理解为什么第二种形式不起作用:

第一种形式:

user=>(def nums(range 3))
(0 1 2)
user=>(map #(list %1) nums)
((0) (1) (2))
第二种形式:

user=> (map #(list %1) (0 1 2))
java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn 
(NO_SOURCE_FILE:0)

问题在于表达式
(0 1 2)
,它被解释为
0
,应用于
1
2
;这是不可能的,因为
0
不是一个函数

(map #(list %1) '(0 1 2))
(map #(list %) [0 1 2])
但是可以按预期工作。

因为
(0 1 2)
表示使用args 1和args 2调用函数0,但0不是函数。因此,您需要使用quote或list函数创建一个列表,而不是函数应用程序,即
'(0 1 2)

或者
(列表0 1 2)

拉斯曼和安克尔拥有它。我意识到这是一个微不足道的例子,但使用向量而不是列表可能更为惯用:

(map #(list %1) [0 1 2])
当只有一个参数传递给匿名函数时,也可以使用
%
而不是
%1

(map #(list %1) '(0 1 2))
(map #(list %) [0 1 2])

是的,我在提交问题后意识到,但由于堆栈溢出限制,我无法回答自己。谢谢你。事实上,你可以回答你自己关于Stackoverflow的问题。也许他的排名太低了或者什么的?