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 ничего не осталось и мы закончили.