这部分功能是封闭吗?

时间:2012-07-19 09:50:35

标签: clojure closures

我正和朋友讨论关闭,他认为(partial + 5)是一个封闭。但我认为闭包是一个关闭自由变量的函数,例如

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

然后func1是一个闭包。但在这种情况下,5不是自由变量。那么哪个是正确的答案?

2 个答案:

答案 0 :(得分:8)

partial使用闭包来创建部分函数。在repl中使用partial查看(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)))))

答案 1 :(得分:0)

(partial + 5)是一个匿名函数或“lambda”。

匿名函数通常称为“闭包”,但它是滥用该术语;请参阅"What is the difference between a 'closure' and a 'lambda'?"

中的讨论

[¹]也许是因为在大多数支持它们的流行语言中,闭包和匿名函数是使用相同的语言功能创建的 - 这使得它们乍一看无法区分。