Dla bota IRC piszę, chcę nadal próbować otworzyć gniazdo, nawet jeśli istnieje UnkownHostException
. Moja pierwsza myśl była czymś takim.Jak mogę powrócić z bloku catch Clojure w bardziej funkcjonalny sposób?
(defn open-socket [{:keys [host port] :as connection}]
(try (java.net.Socket. host port)
(catch java.net.UnknownHostException _ (recur connection))))
Ale to nie działa, ponieważ nie można powtórzyć z bloku catch. Więc zamiast tego ustaliłem coś takiego:
(let [socket (promise)
_ (while (not (realized? socket))
(try (deliver socket (java.net.Socket. host port))
(catch java.net.UnknownHostException _)))
socket @socket]
...
To działa, ale jest okropnie konieczne. Czy istnieje bardziej funkcjonalny sposób, w jaki mogę to robić, czego nie widzę?
Clever! Dzięki! – mybuddymichael