7
私はIntro to Functionsの問題を抱えていますが、何が起こっているのかよく分かりません。以下の4つの表現はどのように異なっていますか?それらがすべて同じ場合、なぜ4つの異なる構文がありますか?Clojure関数リテラル
(partial + 5)
#(+ % 5)
(fn [x] (+ x 5))
(fn add-five [x] (+ x 5))
私はIntro to Functionsの問題を抱えていますが、何が起こっているのかよく分かりません。以下の4つの表現はどのように異なっていますか?それらがすべて同じ場合、なぜ4つの異なる構文がありますか?Clojure関数リテラル
(partial + 5)
#(+ % 5)
(fn [x] (+ x 5))
(fn add-five [x] (+ x 5))
(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
を使用する必要がありますが、これは必ずしも可能ではありません。