2012-03-09 13 views
7

Mam problem z Intro to Functions, ale nie do końca rozumiem, co się dzieje? W jaki sposób 4 wyrażenia poniżej są różne? Jeśli wszystkie są takie same, dlaczego mają 4 różne składnie?Literały funkcji Clojure

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

Odpowiedz

18
  • (fn [x] (+ x 5)) i #(+ % 5) - Te dwie są równe, to ostatnie właśnie wykorzystuje dispatch macro aby kod nieco bardziej zwięzły. W przypadku krótkich funkcji zazwyczaj preferowana jest składnia #(), a składnia (fn [x]) jest lepsza w przypadku funkcji, które są nieco dłuższe. Ponadto, jeśli masz zagnieżdżone anonimowe funkcje, nie możesz użyć #() dla obu z powodu niejednoznaczności, która by to spowodowała.

  • (fn add-five [x] (+ x 5)) - jest taki sam jak powyższe dwa, z tym że ma nazwę: dodaj-pięć. Może się to czasami przydać, np. Jeśli musisz wykonać rekurencyjne wywołanie funkcji. *

  • (partial + 5) - W clojure, + jest funkcją variadic. Oznacza to, że może przyjąć dowolną liczbę argumentów. (+ 1 2) i (+ 1 2 3 4 5 6) są obie całkowicie prawidłowe formy. partial tworzy nową funkcję, która jest identyczna z +, z tym że pierwszym argumentem jest zawsze 5. Z tego powodu, ((partial + 5) 3 3 3) jest poprawny. W tym przypadku nie można użyć innych formularzy.

* Podczas wykonywania wywołania rekursywnego z pozycji ogonowej należy użyć recur, jednak nie zawsze jest to możliwe.