У меня есть несколько операций, которые я хочу добавить в поток, где каждая может завершиться неудачей. Я бы предпочел получить ошибку как значение, а не использовать try-catch, который нарушает поток выполнения.
Я могу сделать наивную версию и заставить мои функции использовать nil в качестве ошибки:
(if-let (op1 ...)
(if-let (op2 ...)
...
err1)
err2)
но это вложенное и затрудняет чтение.
Я мог бы использовать some->
, который кажется самым близким решением, но он не говорит, что не удалось:
(if-let [res (some-> arg
op1
op2)]
res
somethin-failed) ;; what failed though?
Я также посмотрел на ->
и cond->
, но, похоже, они не помогают.
Я знаю, что в Интернете есть макросы для подобных вещей, но я бы не стал добавлять макросы, если что-то существует для решения этой проблемы. Надеюсь, есть что-то вроде:
(some-with-err-> arg
op1 err1
op2 err2
...)
Возможно, я упускаю из виду нечто более простое, но я не могу найти что-то встроенное для решения этой проблемы.
Я могу написать макрос, чтобы сделать это, но сейчас лучше его избегать.