Clojure中的匿名函数

2 clojure anonymous-function

也许这听起来很荒谬,但对于我来说,仍然不能完全清楚#匿名函数应该来自何处.例如,在此示例中,我过滤了正数的除数:

(filter #(zero? (mod 6 %)) (range 1 (inc 6)))  ;;=> (1 2 3 6)
Run Code Online (Sandbox Code Playgroud)

但是在它# 之前放右(mod 6 %)会导致错误.在这种情况下我的匿名函数是否开始有规则,为什么要在此#之前出现(zero? ...

Ala*_*son 7

这显示了#(...)语法只是(fn [x] ...)的简写:

(defn divides-6 [arg]
  (zero? (mod 6 arg)))

(println  (filter divides-6                   (range 1 10))) ; normal function
(println  (filter (fn [x] (zero? (mod 6 x)))  (range 1 10))) ; anonymous function
(println  (filter        #(zero? (mod 6 %))   (range 1 10))) ; shorthand version

;=> (1 2 3 6)
;=> (1 2 3 6)
;=> (1 2 3 6)
Run Code Online (Sandbox Code Playgroud)

使用defn只是简写(def divides-6 (fn [x] ...))(即deffn部分合并defn以节省一点点打字).divides-6如果我们只使用一次函数,我们不需要定义全局名称.我们可以直接定义函数内联的位置.该#(...)语法是一样的例子显示了一个速记版本.

请注意,表单的全名#(...)是"匿名函数文字".您可能还会看到它称为"功能阅读器宏"或只是"功能宏".语法(fn [x] ...)称为"函数特殊形式".