定义匿名函数
有两种方法可以定义匿名函数:完整语法和速记。
完整的匿名函数语法
(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))