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 使用doseq和into从let返回数组_Clojure - Fatal编程技术网

Clojure 使用doseq和into从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语句返回一个列表

(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”]
是一个变量,可以是任何列表,对吗,但是不管列表是什么,你都可以直接返回,因为它是不可变的