如果我理解正确,Clojure 可以返回列表(就像在其他 Lisps 中一样),也可以返回向量和集合。
我真正不明白的是为什么并不总是有一个集合被返回。
例如,如果我采用以下代码:
(loop [x 128]
(when (> x 1)
(println x)
(recur (/ x 2))))
它确实打印了 128 64 32 16 8 4 2。但这只是因为println被调用并且println具有打印某些东西的副作用(?)。
所以我尝试用这个替换它(删除println):
(loop [x 128]
(when (> x 1)
x
(recur (/ x 2))))
我期待得到一些收集(据说是一个列表),像这样:
(128 64 32 16 8 4 2)
但相反,我得到了nil。
我不明白哪个决定了什么创建一个集合,什么没有,以及你如何从一个切换到另一个。此外,看到 Clojure 以某种方式鼓励了“函数式”编程方式,您不应该几乎总是返回集合吗?
为什么有这么多显然不返回任何集合的函数?制作这些退货系列的惯用方式是什么?
例如,我将如何通过首先构造一个集合然后以一种惯用的方式迭代(?)而不是生成的列表/向量来解决上述问题?
首先,我不知道如何转换循环以使其产生除nil以外的其他内容,然后我尝试了以下操作:
(reduce println '(1 2 3))
但它打印“1 2nil 3nil”而不是我期待的“1 2 3nil” 。
我意识到这是基本的东西,但我才刚刚开始,我显然在这里缺少基本的东西。
(PS:适当地重新标记,我不知道我应该在这里使用哪些术语)