6

私は友人と閉鎖について話し合っています、そして彼は(partial + 5)閉鎖だと思っています。しかし、クロージャーは、たとえば自由変数を閉じる関数だと思います

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

その後func1、閉鎖です。しかし、この場合5は自由変数ではありません。では、どちらが正しい答えですか?

4

2 に答える 2

8

partialクロージャを使用して部分関数を作成します。partialreplでを使用してのコードを確認する(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)))))
于 2012-07-19T10:11:06.940 に答える
0

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

匿名関数はしばしば「クロージャ」と呼ばれます¹が、これは用語の乱用です。「「クロージャ」と「ラムダ」の違いは何ですか?」の説明を参照してください。


[¹]おそらく、それらをサポートする最も一般的な言語では、クロージャと無名関数が同じ言語機能を使用して作成されているため、一見区別がつかなくなります。

于 2013-11-30T20:23:19.123 に答える