Functional programming Clojure中的命名参数函数

Functional programming Clojure中的命名参数函数,functional-programming,clojure,Functional Programming,Clojure,这段代码讨论了Clojure中“Clojure的乐趣”中的命名参数: 函数本身,我理解它-解构没有问题-但我不理解调用。 我们是否将四个参数传递给slope?向量是如何分配给:p1和:p2的?您正在向slope传递四个参数,是的。slope的[]部分指定了参数,其中&表示“将所有附加参数转换为此形式”,然后指定它正在查找构成带有键p1和p2的映射的参数(如果其中一个不存在,则给出默认值).我知道了,但调用时:(slope:p1[4 15]:p2[3 21])p1如何获得值[4 15]和p2[3

这段代码讨论了Clojure中“Clojure的乐趣”中的命名参数:

函数本身,我理解它-解构没有问题-但我不理解调用。

我们是否将四个参数传递给slope?向量是如何分配给:p1和:p2的?

您正在向slope传递四个参数,是的。
slope
[]
部分指定了参数,其中
&
表示“将所有附加参数转换为此形式”,然后指定它正在查找构成带有键
p1
p2
的映射的参数(如果其中一个不存在,则给出默认值).

我知道了,但调用时:(slope:p1[4 15]:p2[3 21])p1如何获得值[4 15]和p2[3 21]?
p1
获得值
[4 15]
,因为参数
:p1[4 15]:p2[3 21]
被视为映射,
slope
中的参数块表示将变量
p1
p2
绑定到该映射中相应的值。
(defn slope [& {:keys [p1 p2] :or {p1 [0 0] p2 [1 1]}}] 
   (float (/ (- (p2 1) (p1 1))
             (- (p2 0) (p1 0)))))

(slope :p1 [4 15] :p2 [3 21])