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