#(if (vector? %) (recur %) [%])
является сокращением для
(fn [%]
(if (vector? %)
(recur %)
[%]))
То, что recur
будет повторяться для этой анонимной функции, а не для какой-либо внешней, и, поскольку она ничего не меняет, это бесконечный цикл.
Что касается предупреждения - проблема остановки, как известно, является неразрешимой, и существует риск попадания в бесконечный цикл при времени компиляции , даже если просто пытаться поместить некоторые эвристики на место.