也许这听起来很荒谬,但对于我来说,仍然不能完全清楚#匿名函数应该来自何处.例如,在此示例中,我过滤了正数的除数:
(filter #(zero? (mod 6 %)) (range 1 (inc 6))) ;;=> (1 2 3 6)
Run Code Online (Sandbox Code Playgroud)
但是在它# 之前放右(mod 6 %)会导致错误.在这种情况下我的匿名函数是否开始有规则,为什么要在此#之前出现(zero? ...?
这显示了#(...)语法只是(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] ...))(即def和fn部分合并defn以节省一点点打字).divides-6如果我们只使用一次函数,我们不需要定义全局名称.我们可以直接定义函数内联的位置.该#(...)语法是一样的例子显示了一个速记版本.
请注意,表单的全名#(...)是"匿名函数文字".您可能还会看到它称为"功能阅读器宏"或只是"功能宏".语法(fn [x] ...)称为"函数特殊形式".