(cons 1 (list 2 3))
返回一个clojure.lang.cons
。我该如何将其转换为clojure.lang.PersistentList
?
(cons 1 (list 2 3))
返回一个clojure.lang.cons
。我该如何将其转换为clojure.lang.PersistentList
?
不要调用cons
并尝试转换结果,而是使用conj
:
(conj (list 2 3) 1)
=> (1 2 3)
(type (conj (list 2 3) 1))
=> clojure.lang.PersistentList
您可以将返回的序列内容应用于 list
函数:
(apply list (cons 1 (list 2 3)))
=> (1 2 3)
(type *1)
=> clojure.lang.PersistentList
conj
函数。 - Kungi最简单的方法是将其转换为向量。在Clojure中,这种数据类型非常好用。实际上,在Clojure编程中,大部分数据都保存在向量或映射中,而列表则用于“代码即数据”(宏系统)。
对于您的情况,解决方案如下:
user=> (vec (cons 1 (list 2 3)))
[1 2 3]
我不知道确切的情况,你需要一个列表而不是向量或序列。因为大多数函数操作的是序列,而不是严格的集合类型。我相信cons
类型也可以工作。
如果你真的需要一个列表,你可以使用into
函数来转换集合的类型。但请记住,当处理列表时,顺序会相反:
user=> (into '() (cons 1 (list 2 3)))
(3 2 1)
所以你需要先反转输入数据:
user=> (into '() (reverse (cons 1 (list 2 3))))
(1 2 3)
user=> (type (into '() (reverse (cons 1 (list 2 3)))))
clojure.lang.PersistentList
(= () '())
- leetwinski
seq?
而不是list?
:它适用于两者。 - leetwinski