J'essaye d'exécuter une fonction plusieurs fois avant d'abandonner les exceptions. Mais il n'est pas valide à Clojure de se reproduire à partir du bloc catch. Comment cela peut-il être réalisé?Clojure: Comment se reproduire lors d'une exception?
(loop [tries 10]
(try
(might-throw-exception)
(catch Exception e
(when (pos? tries) (recur (dec tries))))))
java.lang.UnsupportedOperationException: Cannot recur from catch/finally
Le mieux que je pouvais trouver est la solution maladroite suivante (emballage Func et de l'appeler)
(defn do-it []
(try
(might-throw-exception)
(catch Exception e nil)))
(loop [times 10]
(when (and (nil? (do-it)) (pos? times))
(recur (dec times))))
C'est une bonne solution. Je voudrais l'ajouter à clojure.contrib ou quelque chose. – GabiMe
C'est en fait la même solution que celle proposée par l'affiche. Mais les macros le rendent plus facile à faire dans le cas général. Les macros sont la caractéristique de tueur de toute variante de lisp. –
Ce n'est pas exactement la même solution. La suggestion de l'affiche n'attrape pas la valeur de retour du bloc, et si c'était le cas, le bloc ne serait pas capable de revenir à zéro. De plus, les exceptions sont avalées. Mais vous avez raison: c'est fondamentalement la même idée. Les macros ne font que masquer le passe-partout. – kotarak