我这里有两个函数,尽管我会返回相同的东西,但它们不会。我无法为自己的生活弄清楚原因。有什么想法吗?
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]
答案 0 :(得分:5)
[xs]
创建一个包含单个项xs
的单元素向量。相反,(vec xs)
不会创建包含项xs
的单元素向量。而是创建一个n元素向量,分别包含xs
中的每个项目。前者的功能为vector
:(vector x y z)
在概念上与[x y z]
相同。与(list x)
和(seq x)
相比:前者创建一个包含输入的单元素序列,而后者将其输入转换为序列。
当然,如果要将conj
移至vector
的结果上,则最好直接构建2元素向量:代替(conj (vector x) y)
,写{{1 }}。