我正在处理Intro to Functions问题,但我不太明白发生了什么?下面的4个表达式有何不同?如果它们完全相同,为什么有4种不同的语法?
(partial + 5)
#(+ % 5)
(fn [x] (+ x 5))
(fn add-five [x] (+ x 5))
答案 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
,但这并非总是可行。