每次从序列中获取两个元素

时间:2012-04-05 14:04:43

标签: clojure

clojure是否像普通的lisp一样具有强大的“循环”。

例如:

每次从序列中获取两个元素

Common Lisp:

(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b))

如何在Clojure中做到这一点?

4 个答案:

答案 0 :(得分:13)

通过利用for和一些解构,您可以实现您的具体示例:

(for [[a b] (partition 2 [1 2 3 4])](use-a-and-b a b))

答案 1 :(得分:3)

cl-loop,这是一个与LOOP类似的工具,还有clj-iterclj-iterate,它们都基于Common iterate looping construct的Common Lisp。

答案 2 :(得分:2)

Clojure的多用途循环结构是{​​{1}}。它没有像CL for内置的那么多功能(特别是那些副作用的功能,因为Clojure鼓励功能纯度),所以很多操作你可能只用loop本身做完成“loop。例如,要对for生成的元素求和,您可以在其前面添加for;要成对地行走元素,你会(如sw1n所示)对输入apply +的输入序列使用partition 2

答案 3 :(得分:1)

我会使用looprecur和解构。

例如,如果我想将每两个值组合在一起:

(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]]

ab分别是序列的第一个和第二个元素,然后rest就是遗留下来的。然后我们可以反复出现,直到rest中没有任何遗留下来,我们就完成了。