我得到了以下代码:
(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-1、compute-2和compute-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-2和result-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))))))然而,这段代码显然很快就变得难以管理。这个问题有没有更好的解决方案?
发布于 2017-06-10 22:31:45
有一个名为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)该代码片断将宏展开成与上一个示例类似的代码。
https://stackoverflow.com/questions/44473817
复制相似问题