定義匿名函式
有兩種方法可以定義匿名函式:完整語法和速記。
完整的匿名函式語法
(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))