我正在和一个朋友讨论关闭,他认为(partial + 5)
是关闭。但我认为闭包是一个关闭自由变量的函数,例如
(let [a 10]
(defn func1 [x] (+ x a))
)
然后func1
是一个闭包。但在这种情况下5
不是自由变量。那么哪个是正确的答案?
partial
使用闭包来实现偏函数。查看partial
by using (source partial)
in repl 的代码,你会发现它使用了闭包。
(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)
是一个匿名函数或“lambda”。
匿名函数通常被称为“闭包”,但它是对术语的滥用;请参阅“'closure' 和 'lambda' 之间的区别是什么?”中的讨论。
[¹] 也许是因为在大多数支持它们的流行语言中,闭包和匿名函数是使用相同的语言特性创建的——这使得它们乍一看无法区分。