Clojure: экспресс неудачных вычислений в качестве значения для core.async

Обычно функции, которые могут потерпеть неудачу, возвращаются nil: some-> макрос предназначен для цепочки вычислений, подобных этому (выглядит как слово "М"). Вопрос в том, как использовать этот подход с core.async, например, для тяжелых async/thread вычисление, которое может потерпеть неудачу и не может вернуться nil из-за ограничения каналов на этом. Является {:right/:left} карты идиоматические? Какие хорошие практики вы используете?

1 ответ

Вы можете сделать что-то похожее на это, используя with-exception-default макрос из библиотеки Тупело. Это позволяет заменить исключение любым произвольным значением, которое может быть "дозорным" значением, указывающим (без исключения), что произошел сбой (например, размещение ключевого слова в канале core.async):

  (let [good (with-exception-default :failed (+ 2 3))
        bad  (with-exception-default :failed (/ 2 0)) ] ... )

good => 5
bad  => :failed

Другой подход заключается в том, чтобы просто обернуть обычную тему -> с тестом:

(or (-> ...<forms>...)  ; assumes `false` cannot be a result
  :failed)
Другие вопросы по тегам