Reintentar algo 3 veces antes de lanzar una excepción - en clojure

No sé cómo implementar esta pieza de código Python en Clojure

for i in range(3):
    try:
        ......
    except e:
        if i == 2:
            raise e
        else:
            continue
    else:
        break

Me pregunto por qué algo tan simple en Python es tan difícil en Clojure. Creo que la dificultad se debe a que Clojure es un lenguaje de programación funcional y, por lo tanto, no es adecuado para una tarea tan imperativa. Este es mi intento:

(first
  (remove #(instance? Exception %)
    (for [i (range 3)]
      (try (......)
              (catch Exception e
                (if (== i 2) 
                  (throw e)
                  e)))))))

Es muy feo, y peor aún, no funciona como se esperaba. El bucle for se evalúa completamente en lugar de perezosamente (me di cuenta de esto cuando puse una impresión en el interior).

Si alguien tiene una mejor idea para implementar eso, por favor ilumíneme.

Respuestas a la pregunta(4)

Su respuesta a la pregunta