составляет список векторов, содержащих элементы, объединенные с индексами,
(def with-indexes (map #(vector %1 %2 ) ['a 'b 'c 'd 'e 'f] (range)))
#'clojure.core/with-indexes
with-indexes
([a 0] [b 1] [c 2] [d 3] [e 4] [f 5])
фильтрует этот список
lojure.core=> (def filtered (filter #(#{1 3 5 7} (second % )) with-indexes))
#'clojure.core/filtered
clojure.core=> filtered
([b 1] [d 3] [f 5])
, затем удаляет индексы.
clojure.core=> (map first filtered)
(b d f)
затем мы связываем его вместе с макросом «последний поток»
(defn filter-by-index [coll idxs]
(->> coll
(map #(vector %1 %2)(range))
(filter #(idxs (first %)))
(map second)))
clojure.core=> (filter-by-index ['a 'b 'c 'd 'e 'f 'g] #{2 3 1 6})
(b c d g)
Мораль этой истории состоит в том, чтобы разбить ее на маленькие независимые части, проверить их, а затем объединить в рабочую функцию.