Получайте два элемента из последовательности каждый раз

Имеет ли clojure мощный "цикл", как обычный lisp.

например:

получаем каждый элемент из последовательности каждый раз

Общий Lisp:

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

как это сделать в Clojure?

Ответ 1

Используя for и некоторую деструкцию, вы можете достичь своего конкретного примера:

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

Ответ 3

Clojure многоцелевая конструкция цикла for. У него не так много функций, как CL loop, встроенных в него (особенно это не побочные эффекты, так как Clojure поощряет функциональную чистоту), так много операций, которые вы могли бы сделать просто с помощью loop "вокруг" for. Например, чтобы суммировать элементы, сгенерированные с помощью for, вы должны поставить перед ним apply +; чтобы ходить по элементам в паре, вы бы (как показывают sw1nn) используете partition 2 на входной последовательности, поданной в for.

Ответ 4

Я бы сделал это с помощью 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 ничего не осталось и мы закончили.