(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)
:前者创建一个包含其输入的单元素序列,而后者将其输入转换为序列。
当然,如果您要 conj
到 vector
的结果上,您不妨直接构建 2 元素向量:而不是 (conj (vector x) y)
,写 [x y]
.
我这里有两个函数,我想 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)
:前者创建一个包含其输入的单元素序列,而后者将其输入转换为序列。
当然,如果您要 conj
到 vector
的结果上,您不妨直接构建 2 元素向量:而不是 (conj (vector x) y)
,写 [x y]
.