请在 2024 年 Clojure 状况调查! 中分享您的想法。

欢迎!请查看 关于 页面以获取更多关于这个工作方式的信息。

0
Clojure
编辑

大家好,

我注意到当我用 3 个参数调用 conj 时,第二个参数被添加为一个向量,而第三个参数不是。

当用 2 个参数调用时,它执行了预期的工作
(apply conj [{:some :map}] [{:some-other :other-map}])
=> [{:some :map} {:some-other :other-map}]

当用 3 个参数调用 conj 时,它会将第二个参数作为向量添加
(apply conj [{:some :map}] [{:some-other :other-map}] nil)
=> [{:some :map} [{:some-other :other-map}]]

(apply conj [{:some :map}] [{:some-other :other-map}] [{:something :else}])
=> [{:some :map} [{:some-other :other-map}] {:something :else}]

我想了解 conj 函数在 3 个参数的情况下为何显示这种行为。
感谢

1 答案

+1

apply函数接受单独的参数值,然后作为其最后一个参数,一个值集,因此最后一个参数总是不同的。我想这正是你缺少的基本概念。最后一个参数值集中的值会被插入到调用过程中。

通用示例

(f 1 2 3 4)可以写成以下任何一种形式(这些都是等效的)

(apply f 1 2 3 4 nil)
(apply f 1 2 3 4 [])
(apply f 1 2 3 [4])
(apply f 1 2 [3 4])
(apply f 1 [2 3 4])
(apply f [1 2 3 4])

在你的例子中,conj是一个首先接受值集的函数,因此第一个参数始终应该是一个向量。然后你预计后续值会作为插入值出现。为了简洁,使用数字表示,这些是等效的

(conj [1] 2)
(apply conj [1] 2 nil)
(apply conj [1] [2])

或者3个值

(conj [1] 2 3)
(apply conj [1] 2 3 nil)
(apply conj [1] 2 3 [])
(apply conj [1] 2 [3])
(apply conj [1] [2 3])

by
edited by
非常感谢,刚刚点击了。
...