clojure 是否像普通的 lisp 一样具有强大的“循环”。
例如:
每次从一个序列中获取两个元素
普通 Lisp:
(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b))
如何在 Clojure 中做到这一点?
clojure 是否像普通的 lisp 一样具有强大的“循环”。
例如:
每次从一个序列中获取两个元素
普通 Lisp:
(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b))
如何在 Clojure 中做到这一点?
通过利用for
和一些解构,您可以实现您的具体示例:
(for [[a b] (partition 2 [1 2 3 4])](use-a-and-b a b))
有cl-loop,它是一个类似于 LOOP 的工作,还有clj-iter和clj-iterate,它们都基于 Common Lisp 的迭代循环结构。
Clojure 的多用途循环结构是for
. 它没有 CLloop
内置的那么多特性(尤其是没有副作用的特性,因为 Clojure 鼓励功能纯洁性),所以你可能简单地用loop
它自己做的许多操作都是“围绕”完成的for
。例如,要对 生成的元素求和,您可以在它前面for
放一个;apply +
要成对遍历元素,您将(如 sw1nn 所示)partition 2
在输入的输入序列上使用for
.
我会用loop
,recur
和解构来做到这一点。
例如,如果我想将每两个值组合在一起:
(loop [[a b & rest] [1 2 3 4 5 6]
result []]
(if (empty? rest)
(conj result [a b])
(recur rest (conj result [a b]))))
以以下结果结束:
=> [[1 2] [3 4] [5 6]]
a
和b
分别是序列的第一个和第二个元素,然后rest
是剩下的。然后我们可以递归地四处走动,直到没有任何东西剩下rest
,我们就完成了。