私は友人と閉鎖について議論しており、彼は(partial + 5)
が閉鎖だと思っています。しかし、私はこの部分的な機能はクロージャですか?
(let [a 10]
(defn func1 [x] (+ x a))
)
例えば
、閉鎖は自由変数以上の関数閉鎖だと思うそしてfunc1
は閉鎖です。しかしこの場合、
5
は自由変数ではありません。だから正しい答えは?
私は友人と閉鎖について議論しており、彼は(partial + 5)
が閉鎖だと思っています。しかし、私はこの部分的な機能はクロージャですか?
(let [a 10]
(defn func1 [x] (+ x a))
)
例えば
、閉鎖は自由変数以上の関数閉鎖だと思うそしてfunc1
は閉鎖です。しかしこの場合、
5
は自由変数ではありません。だから正しい答えは?
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)))))
なぜそれはそのように書かれていますか?私はちょうど今学んでいます、そして、 "varargs"実装(それ以上のもの)があるので、[f arg1]は重複しているようです。 – themistoklik
最も一般的なケースを最適化するでしょう – Sushisource
(partial + 5)
は、無名関数または「ラムダ」です。
無名関数はしばしば「クロージャ」と呼ばれますが、用語の乱用です。一見区別でき、それらをレンダリングする - それらをサポートする最も人気のある言語で、閉鎖や無名関数は、同じ言語機能を使用して作成されているかもしれないので、"What is the difference between a 'closure' and a 'lambda'?"
[¹]での議論を参照してください。
受け入れられた回答は実装上正しいものですが、私はクロージャと見なされるべきではなく、むしろ「ちょうど」部分的なアプリケーションであると主張します。クロージャの使用は、呼び出し側に直接公開されない内部実装の詳細です。 – user2864740