Clojure函数文字

use*_*898 7 functional-programming clojure

我正在做功能简介问题,但我不太明白发生了什么?下面的4个表达式有何不同?如果它们都相同,为什么有4种不同的语法?

(partial + 5)
#(+ % 5)
(fn [x] (+ x 5))
(fn add-five [x] (+ x 5))
Run Code Online (Sandbox Code Playgroud)

dby*_*rne 18

  • (fn [x] (+ x 5))#(+ % 5)-这两个是完全等价的,后者只使用派遣宏使代码更简洁.对于短函数,#()通常首选(fn [x])语法,对于稍长的函数,语法更好.此外,如果您有嵌套的匿名函数,则不能同时使用#()它们,因为这会导致模糊不清.

  • (fn add-five [x] (+ x 5)) - 与上面两个相同,除了它有一个名称:add-five.这有时很有用,比如你需要对你的函数进行递归调用.*

  • (partial + 5)- 在clojure中,+是一种可变函数.这意味着它可以接受任意数量的参数. (+ 1 2)并且(+ 1 2 3 4 5 6)都是完全有效的形式.partial正在创建一个与之相同的新函数+,除了第一个参数始终为5.因此,它((partial + 5) 3 3 3)是有效的.在这种情况下,您无法使用其他表单.

*当从尾部位置进行递归调用时,您应该使用recur,但这并不总是可行的.