powtórzyć coś 3 razy, zanim rzucisz wyjątek - w clojure

Nie wiem, jak zaimplementować ten fragment kodu Pythona w Clojure

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

Zastanawiam się, dlaczego coś tak prostego w Pythonie jest tak trudnego w Clojure. Myślę, że trudność polega na tym, że Clojure jest funkcjonalnym językiem programowania, a zatem nie nadaje się do takiego imperatywnego zadania. To jest moja próba:

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

Jest bardzo brzydki, a co gorsza, nie działa zgodnie z oczekiwaniami. Pętla for jest w rzeczywistości oceniana w pełni zamiast leniwie (zdałem sobie z tego sprawę, gdy umieściłem println w środku).

Jeśli ktoś ma lepszy pomysł na wdrożenie tego, proszę mnie oświecić.

questionAnswers(4)

yourAnswerToTheQuestion