2012-03-09 53 views
7

我在做Intro to Functions的問題,但我不太明白是怎麼回事? 4個表達式如何不同?如果它們都一樣,爲什麼有4種不同的語法?Clojure函數文字

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

回答

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,但這並非總是可行。