Clojure(或Lisp)等效的复合布尔测试

时间:2009-02-11 03:11:14

标签: lisp clojure boolean

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

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

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

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

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

4 个答案:

答案 0 :(得分:35)

Common Lisp and Scheme

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

答案 1 :(得分:17)

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

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

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

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

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

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

答案 2 :(得分:8)

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

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

显然可能更简洁(例如Doug的答案),但我认为这种方法对于人们来说更自然 - 尤其是如果未来的代码读者具有C ++或Java背景的话!

答案 3 :(得分:2)

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

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

(or x y)类似但反转。