Clojure函数字面量

8
我正在做函数入门问题,但是我不太理解正在发生什么?下面的4个表达式有何不同?如果它们都是相同的,为什么有4种不同的语法?
(partial + 5)
#(+ % 5)
(fn [x] (+ x 5))
(fn add-five [x] (+ x 5))
1个回答

19
  • (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,但这并非总是可行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接