Clojure:列表和返回列表的函数之间的差异

时间:2011-12-07 16:20:09

标签: 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_SOURCE_FILE:0)

4 个答案:

答案 0 :(得分:11)

问题是表达式(0 1 2),其被解释为0应用于12;这是不可能的,因为0不是一个功能。

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

按预期工作。

答案 1 :(得分:5)

因为(0 1 2)表示使用args 1和2调用函数0,但0不是函数。所以你需要使用引号或列表函数来创建列表而不是函数应用程序,即'(0 1 2)(list 0 1 2)

答案 2 :(得分:4)

larsmans和Ankur有它。我意识到这是一个微不足道的例子,但使用向量而不是列表可能更为惯用:

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

当只有一个arg传递给匿名函数时,您也可以使用%代替%1

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

答案 3 :(得分:1)

user=> (map list (range 3))
((0) (1) (2))
user=> (map list '(0 1 2))
((0) (1) (2))
user=> (map list [0 1 2])
((0) (1) (2))