2012-07-19 12 views
5

私は友人と閉鎖について議論しており、彼は(partial + 5)が閉鎖だと思っています。しかし、私はこの部分的な機能はクロージャですか?

(let [a 10] 
    (defn func1 [x] (+ x a)) 
) 

例えば

、閉鎖は自由変数以上の関数閉鎖だと思うそして func1は閉鎖です。しかしこの場合、 5は自由変数ではありません。だから正しい答えは?

+0

受け入れられた回答は実装上正しいものですが、私はクロージャと見なされるべきではなく、むしろ「ちょうど」部分的なアプリケーションであると主張します。クロージャの使用は、呼び出し側に直接公開されない内部実装の詳細です。 – user2864740

答えて

7

partialは、部分機能を行うためにクロージャを使用します。 replの(source partial)を使用してpartialのコードを確認すると、クロージャが使用されていることがわかります。

(defn partial 
    "Takes a function f and fewer than the normal arguments to f, and 
    returns a fn that takes a variable number of additional args. When 
    called, the returned function calls f with args + additional args." 
    {:added "1.0"} 
    ([f arg1] 
    (fn [& args] (apply f arg1 args))) 
    ([f arg1 arg2] 
    (fn [& args] (apply f arg1 arg2 args))) 
    ([f arg1 arg2 arg3] 
    (fn [& args] (apply f arg1 arg2 arg3 args))) 
    ([f arg1 arg2 arg3 & more] 
    (fn [& args] (apply f arg1 arg2 arg3 (concat more args))))) 
+0

なぜそれはそのように書かれていますか?私はちょうど今学んでいます、そして、 "varargs"実装(それ以上のもの)があるので、[f arg1]は重複しているようです。 – themistoklik

+0

最も一般的なケースを最適化するでしょう – Sushisource

0

(partial + 5)は、無名関数または「ラムダ」です。

無名関数はしばしば「クロージャ」と呼ばれますが、用語の乱用です。一見区別でき、それらをレンダリングする - それらをサポートする最も人気のある言語で、閉鎖や無名関数は、同じ言語機能を使用して作成されているかもしれないので、"What is the difference between a 'closure' and a 'lambda'?"


[¹]での議論を参照してください。

関連する問題