Clojure函数文字

时间:2012-03-09 18:03:29

标签: clojure functional-programming

我正在处理Intro to Functions问题,但我不太明白发生了什么?下面的4个表达式有何不同?如果它们完全相同,为什么有4种不同的语法?

(partial + 5)
#(+ % 5)
(fn [x] (+ x 5))
(fn add-five [x] (+ x 5))

1 个答案:

答案 0 :(得分:18)

  • (fn [x] (+ x 5))#(+ % 5) - 这两个完全等效,后者只使用dispatch macro使代码更简洁。对于简短函数,通常首选#()语法,(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,但这并非总是可行。