Clojure 这部分函数是闭包吗?

Clojure 这部分函数是闭包吗?,clojure,closures,Clojure,Closures,我正在和一个朋友讨论结束,他认为(partial+5)就是结束。但我认为闭包是一个函数,比如,在一个自由变量上闭包 (let [a 10] (defn func1 [x] (+ x a)) ) 然后func1是一个闭包。但在这种情况下,5不是自由变量。那么,哪一个是正确的答案 partial使用闭包生成分部函数。在repl中使用(source partial)检查部分的代码,您将看到它使用闭包 (defn partial "Takes a function f and fewer th

我正在和一个朋友讨论结束,他认为
(partial+5)
就是结束。但我认为闭包是一个函数,比如,在一个自由变量上闭包

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

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

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)))))
(部分+5)
是一个匿名函数或“lambda”

匿名函数通常被称为“闭包”,但这是对该术语的滥用;请参阅中的讨论



[1]可能是因为在支持闭包和匿名函数的大多数流行语言中,闭包和匿名函数都是使用相同的语言功能创建的,这使得它们乍一看就不可区分。

虽然公认的答案在实现方面是正确的,但我认为它不应该被视为闭包,而应该“只是”部分申请。闭包的使用是一个内部实现细节,不会直接向调用方公开。为什么这样写?我现在正在学习,[f arg1]似乎是多余的,因为有一个“varargs”实现(一个带有&更多)安全的赌注是它在优化最常见的情况