2012-03-09 11 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であることを除いて上記2と同じです。関数への再帰呼び出しを行う必要がある場合など、これは時に便利です*

  • (partial + 5) - クロージャでは、+は可変関数です。つまり、任意の数の引数を受け入れることができます。 (+ 1 2)(+ 1 2 3 4 5 6)はどちらも完全に有効な形式です。 partialは、+と同じ新しい関数を作成していますが、最初の引数は常に5です。このため、((partial + 5) 3 3 3)が有効です。この場合、他のフォームは使用できません。

*テールポジションから再帰呼び出しを行う場合は、recurを使用する必要がありますが、これは必ずしも可能ではありません。

関連する問題