Clojure:将计算失败表示为core.async的值

时间:2018-04-13 17:42:35

标签: error-handling clojure core.async

通常可能失败的函数返回nilsome->宏被设计为链式计算(看起来像#34; M" word)。问题是如何将此方法与core.async一起使用,例如park for heavy async/thread计算可能会失败并且由于通道限制而无法返回nil{:right/:left}映射是惯用的吗?你使用的任何好的做法?

1 个答案:

答案 0 :(得分:0)

您可以使用with-exception-defaultfrom the Tupelo library执行与此类似的操作。它允许您用任意值替换异常,该值可以是“sentinal”值以指示(以非异常方式)发生故障(例如将关键字放在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)