Короткое, «умное» решение будет следующим:
(defn sep [lst]
(let [x (partition-by identity lst)]
(filter last (map concat (cons [] x) x))))
Проблема «переполнения стека» связана с философией Clojure, касающейся рекурсии, и ее легко избежать при правильном подходе.Вы должны всегда реализовывать эти типы функций * ленивым способом: если вы не можете найти хитрость для решения проблемы с использованием библиотечных функций, как я делал выше, вы должны использовать «lazy-seq» для общего решения (например, pmjordan)сделал) как объяснено здесь: http://clojure.org/lazy
* Функции, которые формируют список и возвращают список как результат.(Если возвращается нечто иное, чем список, идиоматическое решение состоит в том, чтобы использовать «recur» и аккумулятор, как показано в примере dfan, который в этом случае я бы не назвал идиоматическим.)