定義匿名函式

有兩種方法可以定義匿名函式:完整語法和速記。

完整的匿名函式語法

(fn [x y] (+ x y))

此表示式求值為函式。你可以使用 defn&,引數解構等)定義的函式使用的任何語法,你也可以使用 fn 表單。defn 實際上是一個只做 (def (fn ...)) 的巨集。

速記匿名函式語法

#(+ %1 %2)

這是速記符號。使用簡寫表示法,你不必明確地命名引數; 根據它們傳入的順序,它們將被分配名稱%1%2%3 等。如果該函式只有一個引數,則其引數僅稱為%

何時使用每個

簡寫符號有一些限制。你不能破壞一個引數,你不能巢狀速記匿名函式。以下程式碼引發錯誤:

(def f #(map #(+ %1 2) %1))

支援的語法

可以使用帶有速記匿名函式的 varargs。這是完全合法的:

#(every? even? %&)

它需要可變數量的引數,如果每個引數都是偶數,則返回 true:

(#(every? even? %&) 2 4 6 8)
;; true
(#(every? even? %&) 1 2 4 6)
;; false

儘管存在明顯的矛盾,但可以通過包含名稱來編寫命名的匿名函式,如下例所示。如果函式需要呼叫自身但也需要在堆疊跟蹤中,這尤其有用。

(fn addition [& addends] (apply + addends))