(vec)与[]向量文字

Sea*_*ary 0 recursion vector clojure literals

我在这里有两个函数,尽管我会返回相同的东西,但它们不会。我无法为自己的生活弄清楚原因。有任何想法吗?

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]
Run Code Online (Sandbox Code Playgroud)

ama*_*loy 5

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

当然,如果您要求conj取结果,vector也可以直接构建2元素向量:而不是(conj (vector x) y)write [x y]