2015-01-02 27 views
24

Kiedy zakładam C, wydaje mi się, że być może idiomatyczny Clojure robi prostą rzecz i sprawdza wartości.Obsługa błędów Idiomatic w Clojure

Kiedy zakładam swój kapelusz Java (niechętnie, muszę dodać), myślę sobie, że skoro Clojure działa na JVM, naturalnym sposobem musi być użycie wyjątków JVM.

Kiedy zakładam swój funkcjonalny kapelusz, myślę, że musi istnieć coś w rodzaju monadycznej konstrukcji lub makro wątku, które może poradzić sobie z błędami w sposób kompozycyjny.

Jaki jest idiomatyczny sposób radzenia sobie z błędami w programie Clojure?

+1

Niemal czuje się, że monada należy do rdzennego Clojure. Po prostu wyrzucenie wyjątku, który moim zdaniem jest typowy, wydaje się być powrotem do imperatywnego sposobu robienia rzeczy. – Mario

Odpowiedz

15

Obsługa błędów Clojure to z reguły wyjątek JVM (odznaczony).

Slingshot sprawia, że ​​używanie wyjątków jest przyjemniejsze, na przykład dzięki destrukturyzacji przy rzucanych wartościach wyjątków.

Aby uzyskać alternatywę, która umożliwia obsługę błędów w stylu erlangu, należy spojrzeć na dire. Ten blog post daje dobry przegląd racjonalnego dla tragicznego, jak również przegląd mechanizmów i błędów obsługi błędów Clojure.

4

Na podejściu bardzo funkcjonalny, rzucić okiem na cats, co odpowiadałoby „jakiś monadycznej budowie”:

Kategoria Teoria i abstrakcje algebraiczne dla Clojure i ClojureScript. http://funcool.github.io/cats/latest/

Przykład wzięty z ich dokumentacją:

(require '[cats.core :as m]) 
(require '[cats.monad.maybe :as maybe]) 

(m/mappend (maybe/just [1 2 3]) 
      (maybe/nothing) 
      (maybe/just [4 5 6]) 
      (maybe/nothing)) 

Widać, że nothing jest nieco równoważne nil, z wyjątkiem nie masz niczego, by sprawdzić ręcznie.

+0

Jako Haskeller faworyzuję monadyczne podejście 'Maybe' przez faaaar, ale nie sądzę, że jest to idiomatyczny Clojure. – MasterMastic

+0

Grałem tylko w repl z kotami, ale wiem, że niektórzy ludzie używają go w produkcji. Istnieje również https://github.com/uncomplicate/fluokitten/, a może nawet https://github.com/bwo/monads, ale istnieje wiele bibliotek obsługi błędów (na przykład dire i slingshot), więc to zdecydowanie czuje się jak coś, co można poprawić w języku podstawowym. – nha