【发布时间】:2012-03-09 18:03:28
【问题描述】:
我在做Intro to Functions 的问题,但我不太明白这是怎么回事?下面的4个表达式有什么不同?如果它们都相同,为什么有4种不同的语法?
(partial + 5)
#(+ % 5)
(fn [x] (+ x 5))
(fn add-five [x] (+ x 5))
【问题讨论】:
标签: clojure functional-programming
我在做Intro to Functions 的问题,但我不太明白这是怎么回事?下面的4个表达式有什么不同?如果它们都相同,为什么有4种不同的语法?
(partial + 5)
#(+ % 5)
(fn [x] (+ x 5))
(fn add-five [x] (+ x 5))
【问题讨论】:
标签: clojure functional-programming
(fn [x] (+ x 5)) 和#(+ % 5) - 这两个完全等价,后者只是使用dispatch macro 使代码更简洁一点。对于短函数,#() 语法通常是首选,(fn [x]) 语法更适合较长的函数。此外,如果您有嵌套的匿名函数,则不能同时使用 #(),因为这会导致歧义。
(fn add-five [x] (+ x 5)) - 与上述两个相同,只是它有一个名称:add-5。这有时很有用,例如,如果您需要对函数进行递归调用。*
(partial + 5) - 在 clojure 中,+ 是一个可变参数函数。这意味着它可以接受任意数量的参数。 (+ 1 2) 和 (+ 1 2 3 4 5 6) 都是完全有效的形式。 partial 正在创建一个与 + 相同的新函数,只是第一个参数始终为 5。因此,((partial + 5) 3 3 3) 是有效的。在这种情况下,您不能使用其他形式。*从尾部位置进行递归调用时,您应该使用recur,但这并不总是可行的。
【讨论】: