Ответ 1
Используя for
и некоторую деструкцию, вы можете достичь своего конкретного примера:
(for [[a b] (partition 2 [1 2 3 4])](use-a-and-b a b))
Имеет ли 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 workalike, а также clj-iter и clj-iterate, которые основаны на итерация цикла построения для Common Lisp.
Clojure многоцелевая конструкция цикла for
. У него не так много функций, как CL loop
, встроенных в него (особенно это не побочные эффекты, так как 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
ничего не осталось и мы закончили.