Clojure 使用doseq和into从let返回数组
我试图从let语句返回一个列表Clojure 使用doseq和into从let返回数组,clojure,Clojure,我试图从let语句返回一个列表 (let [data []] (doseq [x ["0" "1" "2" "3" "4"]] (into data (do-stuff x))) data) 但是,数据列表始终为空 我在let作用域返回值时检查了答案,但无法解决此问题。如果您试图了解Clojure中的循环机制,您可能正在寻找答案(假设您所做的只是一个集合如何工作的练习): (对于[x[“1”2“3”]]x) 结果是: (“1”2“3”) 当然,如果这就是您要做的全部,那么您已经拥有了集合
(let [data []]
(doseq [x ["0" "1" "2" "3" "4"]]
(into data (do-stuff x))) data)
但是,数据
列表始终为空
我在let作用域返回值时检查了答案,但无法解决此问题。如果您试图了解Clojure中的循环机制,您可能正在寻找答案(假设您所做的只是一个集合如何工作的练习):
(对于[x[“1”2“3”]]x)
结果是:
(“1”2“3”)
当然,如果这就是您要做的全部,那么您已经拥有了集合,不需要构建它
根据您的编辑,执行以下操作:
(对于[x[“1”“2”“3”]](执行任务x))
不过,还有很多其他方法可以完成这类工作,比如使用map
或reduce
和其他工具,具体取决于do stuff
的复杂性和需要访问的内容
请记住,Clojure中的值是不可变的,默认情况下是不可变的。您根本无法更改数据
,它的值固定为[]
。除非你把它变成一个原子,这对于你所需要的是不必要的。函数式编程是建立值,而不是改变变量
有很多方法可以表达您想要做的事情,但是for
是do-seq
的列表构建(“列表理解”)版本,因为它们具有相同的一般结构。因为你的问题是关于do seq
,我讨论是为了更好的衡量。但是map
在这里是一个更好的选择。如果您确实需要它是一个向量,而不是一个惰性序列,那么使用mapv
如果您需要一个名为data
的东西来保存这些结果,那么只需执行以下操作:
(let [data (for [x ["1" "2" "3"]] x)] ;;or map, etc
;;do something with data
)
如果要修改每个元素并返回向量,可以使用mapv
:
(mapv do-stuff ["0" "1" "2" "3" "4"])
如果您只需要序列输出,也可以使用map
:
(map do-stuff ["0" "1" "2" "3" "4"])
或一个表达:
(for [x ["0" "1" "2" "3" "4"]] (do-stuff x))
for
表达式返回一个序列,如果需要,可以使用vec
将其转换为向量:
(vec (for [x ["0" "1" "2" "3" "4"]] (do-stuff x)))
数据
是不可变的-如果您想返回[“0”“1”“2”“3”“4”
您可以直接返回它,而不是尝试将其复制到新列表中。这只是一个示例,[“0”“1”“2”“3”“4”]
是一个变量,可以是任何列表,对吗,但是不管列表是什么,你都可以直接返回,因为它是不可变的