函数调用 - >线程宏

时间:2011-10-20 15:26:35

标签: clojure

我们需要括号来调用匿名函数

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)

1 个答案:

答案 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。