21

在 C++ 中,我会写这样的东西:

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

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

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

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

4

4 回答 4

35

在 Common Lisp 和 Scheme 中

(and (= a something) (= b another) (foo))
于 2009-02-11T03:13:32.377 回答
17

在 Common Lisp 中,以下也是一个常见的习语:

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

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

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

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

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

于 2009-02-11T08:32:29.913 回答
8

在 Clojure 中,我通常会使用类似的东西:

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

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

于 2010-10-29T15:16:00.873 回答
2

这真的很酷!(and x y)是一个宏——您可以在 clojure.org 上查看源代码——它扩展为(if x y false)等价于:

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

(or x y)相似但相反。

于 2010-10-29T16:20:40.327 回答