Clojure:如何将cons转换为list
Clojure:如何将cons转换为list,clojure,Clojure,(cons1(列表23))返回一个clojure.lang.cons。如何将其转换为clojure.lang.PersistentList?您可以将返回序列的内容应用于list函数: (apply list (cons 1 (list 2 3))) => (1 2 3) (type *1) => clojure.lang.PersistentList 最简单的方法是把它变成一个向量。这种数据类型在Clojure中非常有效。事实上,在Clojure中编程时,大部分数据保存在向量或映射
(cons1(列表23))
返回一个clojure.lang.cons
。如何将其转换为clojure.lang.PersistentList
?您可以将返回序列的内容应用于list
函数:
(apply list (cons 1 (list 2 3)))
=> (1 2 3)
(type *1)
=> clojure.lang.PersistentList
最简单的方法是把它变成一个向量。这种数据类型在Clojure中非常有效。事实上,在Clojure中编程时,大部分数据保存在向量或映射中,而列表用于“代码为数据”(宏系统)
在您的情况下,解决方案是:
user=> (vec (cons 1 (list 2 3)))
[1 2 3]
我不知道这种情况下,你需要一个确切的列表,而不是一个向量或序列。因为大多数函数都是在序列上操作的,而不是严格的集合类型。我相信cons
类型也应该有效
如果您确实需要一个列表,您可以使用转换为
函数来转换集合的类型。但请记住,在处理列表时,顺序将相反:
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
不要调用cons
并尝试转换结果,请使用:
Clojure:如何将cons转换为list
不要
Clojure就是建立在这个基础上的。其中最重要的一点是
我想不出为什么您要将cons
转换为列表,或者反之亦然。它们都是序列,其他什么都没有。你可以用一个做什么,你可以用另一个做什么
以上是李特温斯基对这个问题的评论 首先,这种转换的目的是什么?就clojure而言,它们是相似的序列。你的目标是什么?如果你需要在某种条件下使用它,使用list?
只需使用seq?
即可:它对双方都有效空列表文字前的引号是可选的:(=()”)
我大体上同意你的答案(并且认为这是这里最好的选项),但当然,人们可能希望序列上有一个列表是有原因的:例如,列表知道它们的计数,而对于一般序列,计数函数可能需要任意时间。然而,对于那些已经不知道如何将序列转换为列表的人来说,很难想象他们到底需要一个列表。
(conj (list 2 3) 1)
=> (1 2 3)
(type (conj (list 2 3) 1))
=> clojure.lang.PersistentList