(vec) vs [ ] 向量字面量

(vec) vs [ ] vector literal

我这里有两个函数,我想 return 做同样的事情,但它们没有。我一辈子都想不通为什么。有什么想法吗?

user=> (defn foo [x] (when (> x 0) (conj (vec (foo (dec x))) x)))
#'user/foo
user=> (defn bar [x] (when (> x 0) (conj [(bar (dec x))] x)))
#'user/bar
user=> (foo 5)
[1 2 3 4 5]
user=> (bar 5)
[[[[[nil 1] 2] 3] 4] 5]

[xs] 创建一个单元素向量,包含单个项目 xs。相反,(vec xs) 不会创建包含项目 xs 的单元素向量。相反,它创建一个 n 元素向量,分别包含 xs 中的每个项目。执行前者的函数是 vector(vector x y z) 在概念上与 [x y z] 相同。比较(list x)(seq x):前者创建一个包含其输入的单元素序列,而后者将其输入转换为序列。

当然,如果您要 conjvector 的结果上,您不妨直接构建 2 元素向量:而不是 (conj (vector x) y),写 [x y].