我们需要括号来调用匿名函数
user=> (-> [1 2 3 4] (conj 5) (#(map inc %)))
(2 3 4 5 6)
为什么在这些示例中map+
和fmap+
周围不需要括号?
user=> (def map+ #(map inc %))
#'user/map+
user=> (-> [1 2 3 4] (conj 5) map+)
(2 3 4 5 6)
user=> (defn fmap+ [xs] (map inc xs))
#'user/fmap+
(-> [1 2 3 4] (conj 5) fmap+)
(2 3 4 5 6)
答案 0 :(得分:17)
->
和->>
宏的documentation表示如果第一个参数之后的表单不是列表,则它们会被包装到列表中。所以问题是为什么这对#()
和(fn ..)
形式不起作用?原因是两个表单在宏扩展时都是列表形式。
例如
(-> 3 (fn [x] (println x)))
在扩展时获取(fn [x] ...)
表单,因此宏认为“很好,它是一个列表,我只需将3插入(fn ..)
列表的第二个位置”。调用macroexpansion,这就是我们得到的:
(fn 3 [x] (println x))
当然不起作用。同样适用于#()
:
(-> 3 #(println %))
扩展为
(fn* 3 [p1__6274#] (println p1__6274#))
这就是为什么我们需要额外的parens。