2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请在 关于 页面了解有关此工作方式的一些更多信息。

0
Clojure
编辑

大家好,

我在调用 conj 时使用 3 个参数时,感觉 arg2 被添加为一个向量,而 arg3 没有被添加。

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

当调用 conj 时使用 3 个参数,它将第二个参数作为一个向量添加
(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)
(应用 f 1 2 3 4 [])
(应用 f 1 2 3 [4])
(应用 f 1 2 [3 4])
(应用 f 1 [2 3 4])
(应用 f [1 2 3 4])

在您的例子中,conj 是一个先接受一个集合作为参数的函数,因此第一个参数应始终是一个向量。然后,您期望有后续值插入其中。以下使用数字简化示例,这些是等效的

(conj [1] 2)
(应用 conj [1] 2 nil)
(应用 conj [1] [2])

或是3个值

(conj [1] 2 3)
(应用 conj [1] 2 3 nil)
(应用 conj [1] 2 3 [])
(应用 conj [1] 2 [3])
(应用 conj [1] [2 3])


编辑
非常感谢,已经点击。
...