如何在测试和cond的结果中使用结果?

时间:2017-06-10 13:27:03

标签: if-statement clojure

我有以下代码:

(cond
  (case-1? (compute-1 x)) (compute-1 x)
  (case-2? (compute-2 x)) (compute-2 x)
  (case-3? (compute-3 x)) (compute-3 x))

我希望避免重复计算compute-1compute-2compute-3。一种选择是:

(let [result-1 (compute-1 x)
      result-2 (compute-2 x)
      result-3 (compute-3 x)]
  (cond 
    (case-1? result-1) result-1
    (case-2? result-2) result-2
    (case-3? result-3) result-3))

现在我不重复计算,但如果现在(case-1? result-1)评估为真,则result-2result-3无缘无故地计算出来。
在行为上,我想要这样的事情:

(let [result-1 (compute-1 x)]
  (if (case-1? result-1)
    result-1
    (let [result-2 (compute-2 x)]
      (if (case-2? result-2)
        result-2
        (let [result-3 (compute-3 x)]
          (if (case-3? result-3)
            result-3))))))

然而,这段代码显然很快变得无法管理。这个问题有更好的解决方案吗?

1 个答案:

答案 0 :(得分:3)

有一个名为better cond的库可以解决宏的问题。

它的使用方式如下:

(ns foo.core
  (:require
   [better-cond.core :as b]))

(b/cond
  :let [result-1 (compute-1 x)]
  (case-1? result-1) result-1

  :let [result-2 (compute-2 x)]
  (case-2? result-2) result-2

  :let [result-3 (compute-3 x)]
  (case-3? result-3) result-3)

该代码段将宏扩展为与您上一个示例相似的代码。