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)