"Programming Clojure"一书中"几乎是咖喱"实现的一个例子

Jay*_*don 4 clojure

在这段代码中,

(defn faux-curry [& args] (apply partial partial args))
Run Code Online (Sandbox Code Playgroud)

我应该如何理解这一部分:

(apply partial partial args)
Run Code Online (Sandbox Code Playgroud)

在我的理解中,'partial'接受一个函数和一些值,然后返回一个函数,其中一些原始函数的变量已修复.它是否首先应用'部分'......第二个'部分',它与args做了什么?有更好的理解方法吗?

Mic*_*zyk 5

手动评估样本参数可能会有所帮助:

(apply partial partial [+ 1 2 3])                     ; 1.
; =>
(partial partial + 1 2 3)                             ; 2.
; =>
(fn [& args] (apply partial + 1 2 (concat [3] args))) ; 3.
Run Code Online (Sandbox Code Playgroud)

我们将1中的样本参数替换为faux-curry1.然后apply手工应用2.然后partial在3中手动应用第一个.(注意,在编译代码中,[3]in 3.实际上是"rest args"的seq partial.)

需要注意的关键是它partial是一个像任何其他函数一样的函数,所以特别是它本身可以作为第一个参数传递给partial.