Быстрое решение:
(let [animals ["dog", "cat", "bird"]]
(map vector (range) animals))
Или, если вы хотите обернуть его в функцию:
(defn enum [s]
(map vector (range) s))
(doseq [[i animal] (enum ["dog", "cat", "bird"])]
(println i animal))
Здесь происходит то, что вектор функции применяется к каждому элементу в обеих последовательностях, а результат собирается в ленивый набор.
Давай, попробуй в своем репле.