我是一个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)
答案 0 :(得分:11)
问题是表达式(0 1 2)
,其被解释为0
应用于1
和2
;这是不可能的,因为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)
(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))