在C ++中我会写这样的东西:
if (a == something && b == anotherthing)
{
foo();
}
我认为Clojure等价物是这样的:
(if (= a something)
(if (= b anotherthing)
(foo)))
还是有另一种方法来执行我错过的逻辑“和”吗?正如我所说,后一种形式似乎工作正常 - 我只是想知道是否有一些更简单的方法来执行逻辑和。在Clojure Google Group上搜索“boolean”“logical”和“and”会产生太多结果,但却没有多大用处。
答案 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)
类似但反转。