Взгляните на источник clojure.walk. Это библиотека для выполнения (массовых) операций со всеми вложенными структурами данных Clojure (кроме упорядоченных карт). Там есть очень мощный, но обманчиво простой код, использующий рекурсию через локально определенные анонимные функции без использования loop / recur.
Большинство имеющихся там функций основаны на функциях postwalk и prewalk, которые в свою очередь основаны на функции прогулки. С помощью источника и (prewalk-demo form) и (postwalk-demo form) вы можете получить хорошее представление о предпринятых рекурсивных шагах.
Я не знаю, может ли это помочь вам в решении вашей проблемы. В настоящее время я пытаюсь сделать что-то в той же проблемной области: создать функцию, чтобы "сгладить" вложенные карты и векторы в последовательность всех путей от корня до листа, каждый путь - последовательность ключей и / или индексов, оканчивающихся на ' значение листа.
Эта библиотека, кажется, делает редактирование значений рекурсивно по всей структуре довольно простым. Однако я до сих пор не знаю, как использовать его для функционального отслеживания накопленных данных между итерациями, которые необходимы для моих «путей» и, вероятно, также для вашей «скелетной» проблемы.