Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:如何将cons转换为list_Clojure - Fatal编程技术网

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