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])