定义匿名函数

有两种方法可以定义匿名函数:完整语法和速记。

完整的匿名函数语法

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