Я покажу, как мне поступить с такой проблемой.Clojure вполне способствует такого рода экспериментам.(Литвински эффективно дал этот ответ в своем комментарии.)
Начните с данных.
'((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
Перетащите это внутрь макроса потока
(->> '((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))) ===> ((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
Разделение на полпути
(->> '((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
(partition 3)) ===> (((2 5) (3 2) (7 3)) ((1 4) (3 7) (4 2)))
На данный момент мы получаем два элемента (всегда).Если мы сможем передать их в map
, а затем объединить каждые два элемента, все готово.Итак,
(->> '((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
(partition 3)
(apply map concat)) ===> ((2 5 1 4) (3 2 3 7) (7 3 4 2))
Теперь удалите жестко запрограммированный материал:
(defn round-robin [s]
(let [half-len (quot (count s) 2)]
(->> s
(partition half-len)
(apply map concat))))
Обратите внимание, что если ввод нечетной длины, функция игнорирует последний элемент.
Мой опыт показывает, что всякий раз, когда вы хотите выполнить какие-либо преобразования для некоторых данных, стоит просто вставить данные в макрос последнего потока (->>
) и продолжать его использовать.Эта проблема довольно проста, но метод работает и для сложных преобразований.