2011-10-20 35 views
8

我们需要这里的圆括号使匿名函数函数调用 - >线程宏观

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) 

回答

16

documentation->->>宏状态,第一个参数后的形式包装成名单,如果他们不列出了。所以问题是为什么这不适用于#()(fn ..)表单?原因是这两种形式在宏观扩张时都是列表形式。

例如

(-> 3 (fn [x] (println x))) 

得到在扩张时(fn [x] ...)形式,所以宏认为“很大,这是一个名单,我就插入3在(fn ..)列表的第二个位置。”调用宏展开,这是我们得到:

(fn 3 [x] (println x)) 

这当然不起作用。同样,对于#()

(-> 3 #(println %)) 

扩大到

(fn* 3 [p1__6274#] (println p1__6274#)) 

这就是为什么我们需要额外的括号。