I've switched to this implementation now, but with support for descending into lists/vectors/sets where necessary. This implementation is faster, and in some ways more flexible. Also - clojure.walk consumed just as much stack as far as I could tell, internally doing its own recursion.