2010-12-11 34 views
4
user> (map (fn [k] [k]) [1 2 3]) 
([1] [2] [3]) 
user> (map #([%1]) [1 2 3]) 
.... Error.. 

爲什麼第二個例子是一個錯誤?Clojure的#lambda marco並不總是和(fn)一樣?

+1

繼續你的榜樣,你可以使用(圖#(矢量%)[1 2 3])用於相同的功能。 – 2010-12-13 17:27:23

+0

或'(地圖矢量[1 2 3])'' – Sonicsmooth 2013-08-25 06:36:47

回答

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#))