我正在做函数入门问题,但是我不太理解正在发生什么?下面的4个表达式有何不同?如果它们都是相同的,为什么有4种不同的语法?
(partial + 5)
#(+ % 5)
(fn [x] (+ x 5))
(fn add-five [x] (+ x 5))
(partial + 5)
#(+ % 5)
(fn [x] (+ x 5))
(fn add-five [x] (+ x 5))
(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
,但这并非总是可行。