首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在测试和cond的结果中使用结果?

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

Stack Overflow用户
提问于 2017-06-10 21:27:03
回答 1查看 63关注 0票数 2

我得到了以下代码:

代码语言:javascript
复制
(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。一种选择是:

代码语言:javascript
复制
(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就会被无缘无故地计算出来。

从行为上讲,我想要这样的东西:

代码语言:javascript
复制
(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))))))

然而,这段代码显然很快就变得难以管理。这个问题有没有更好的解决方案?

EN

回答 1

Stack Overflow用户

发布于 2017-06-10 22:31:45

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

它的用法如下:

代码语言:javascript
复制
(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)

该代码片断将宏展开成与上一个示例类似的代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44473817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档