分享你的想法,参加 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)
(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])

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