Это обычная SO [clojure] гонка, которая предлагает самое краткое решение.:-) Обычно я не побеждаю, но многому учусь в процессе.В любом случае, вот мое решение:
(defn interpose-p [[a b & _ :as s] d p]
(when-not (empty? s)
(if (and (not (nil? b)) (p a b))
(cons a (cons d (interpose-p (rest s) d p)))
(cons a (interpose-p (rest s) d p)))))
(interpose-p [1 2 3 2 1 2 3] "," <)
(1 "," 2 "," 3 2 1 "," 2 "," 3)
Обновление : Несмотря на то, что обсуждение окончено, здесь есть обновленное решение, учитывающее все комментарии.Это время должно быть достаточно сильным, если я правильно понимаю lazy-seq.Он спровоцирован ленивым обсуждением здесь .
(defn interpose-p
[pred coll sep]
(let [f (fn [c]
(when-let [[a b & _ :as s] (seq c)]
(if (and b (pred a b))
(list* a sep (interpose-p pred (rest s) sep))
(list* a (interpose-p pred (rest s) sep)))))]
(lazy-seq (f coll))))