【问题标题】:The Clojure (or Lisp) Equivalent of a Compound Boolean Test复合布尔测试的 Clojure(或 Lisp)等价物
【发布时间】:2009-02-11 03:11:13
【问题描述】:

在 C++ 中我会这样写:

if (a == something && b == anotherthing)
{
   foo();
}

我认为 Clojure 等价物是这样的是否正确:

(if (= a something)
    (if (= b anotherthing)
        (foo)))

或者还有其他方法可以执行我错过的逻辑“和”吗?正如我所说,后一种形式似乎工作正常——我只是想知道是否有一些更简单的方法来执行逻辑与。在 Clojure Google Group 上搜索“boolean”、“logical”和“and”会发现太多结果,没有太多用处。

【问题讨论】:

  • Lisp 代码请使用标准缩进,并且不要将右括号放在自己的行上。我可以编辑吗?
  • @Harleqin 请随时解决此问题。我正在学习 clojure,我想知道已建立的代码格式化习语。
  • 好的。请注意,if 语句的子部分是对齐的。这是通常的方式。对于某些结构(主要是当你有一个“主体”时),一个只是将缩进增加两个空格。我不知道 Clojure 是否有特定的样式指南,但您可以尝试从 Common Lisp 推断。
  • gigamonkeys.com/book/syntax-and-semantics.html -- 查看“格式化 Lisp 代码”部分(接近尾声)。一个好的编辑器会帮助你格式化;事实上,当自动格式化不符合您的期望时,您几乎可以看到您做错了什么。
  • @Harlequin--感谢您修复代码并感谢您提供指向格式化文档的指针。

标签: lisp clojure boolean


【解决方案1】:

在 Common Lisp 和 Scheme 中

(and (= a something) (= b another) (foo))

【讨论】:

  • 啊,短路真是太好了,不是吗?
  • 谢谢道格。我不知道为什么我从来没有想过在 Clojure 网站上检查“和”。现在看起来非常明显。
  • 您也可以从 clojure 中检查,例如(doc and).
【解决方案2】:

在 Common Lisp 中,以下也是常用的成语:

(when (and (= a something) (= b another))
  (foo))

将此与 Doug Currie 使用 (and ... (foo)) 的答案进行比较。语义是相同的,但根据 (foo) 的返回类型,大多数 Common Lisp 程序员会更喜欢其中一个:

  • (foo) 返回布尔值的情况下使用(and ... (foo))

  • (foo) 返回任意结果的情况下使用(when (and ...) (foo))

证明规则的一个例外是程序员知道这两个习语的代码,但无论如何故意写(and ... (foo))。 :-)

【讨论】:

    【解决方案3】:

    在 Clojure 中,我通常会使用如下内容:

    (if 
      (and (= a something) (= b anotherthing))
      (foo))
    

    显然可以更简洁(例如 Doug 的回答),但我认为这种方法更适合人们阅读 - 特别是如果代码的未来读者具有 C++ 或 Java 背景!

    【讨论】:

      【解决方案4】:

      真的很酷! (and x y) 是一个宏——您可以在 clojure.org 上查看 source code——扩展为 (if x y false) 相当于:

      if (x) {
        if (y) {
          ...
        }
      } else {
        false
      }
      

      (or x y) 类似但相反。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-16
        • 1970-01-01
        • 2011-11-29
        • 2021-04-10
        • 1970-01-01
        • 2012-07-03
        • 1970-01-01
        • 2021-09-13
        相关资源
        最近更新 更多