私は友人と閉鎖について話し合っています、そして彼は(partial + 5)
閉鎖だと思っています。しかし、クロージャーは、たとえば自由変数を閉じる関数だと思います
(let [a 10]
(defn func1 [x] (+ x a))
)
その後func1
、閉鎖です。しかし、この場合5
は自由変数ではありません。では、どちらが正しい答えですか?
partial
クロージャを使用して部分関数を作成します。partial
replでを使用してのコードを確認する(source 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)))))
(partial + 5)
匿名関数または「ラムダ」です。
匿名関数はしばしば「クロージャ」と呼ばれます¹が、これは用語の乱用です。「「クロージャ」と「ラムダ」の違いは何ですか?」の説明を参照してください。
[¹]おそらく、それらをサポートする最も一般的な言語では、クロージャと無名関数が同じ言語機能を使用して作成されているため、一見区別がつかなくなります。