Clojure的#lambda marco并不总是和(fn)一样?

时间:2010-12-11 19:46:50

标签: clojure

user> (map (fn [k] [k]) [1 2 3])
([1] [2] [3])
user> (map #([%1]) [1 2 3])
.... Error..

为什么第二个例子是错误的?

1 个答案:

答案 0 :(得分:3)

#(<expr>)阅读器宏将<expr>包装在一组额外的括号中,因此#([%1])扩展为等同于(fn [%1] ([%1]))而非(fn [%1] [%1])的内容。所以你是对的。它们并不完全等同。

你可以在REPL中尝试以下内容,它将揭示确切的扩展:

user=> '#([%1])                   
(fn* [p1__862#] ([p1__862#]))
user=> '#(inc %1) 
(fn* [p1__865#] (inc p1__865#))