复合布尔测试的Clojure(或Lisp)等价物 在C++中,我会写这样的东西: if (a == something && b == anotherthing) { foo(); } (if (= a something) (if (= b anotherthing) (foo)))

复合布尔测试的Clojure(或Lisp)等价物 在C++中,我会写这样的东西: if (a == something && b == anotherthing) { foo(); } (if (= a something) (if (= b anotherthing) (foo))),lisp,clojure,boolean,Lisp,Clojure,Boolean,我认为Clojure的等价物是这样的,对吗 if (a == something && b == anotherthing) { foo(); } (if (= a something) (if (= b anotherthing) (foo))) 或者有没有其他方法来执行我错过的逻辑“和”?正如我所说,后一种形式似乎工作正常——我只是想知道是否有更简单的方法来执行逻辑and。在Clojure Google组中搜索“boolean”、“logic

我认为Clojure的等价物是这样的,对吗

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

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

在公共Lisp和Scheme中

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

在Common Lisp中,以下也是一种常见的习惯用法:

(when (and (= a something) (= b another))
  (foo))
使用
(和…(foo))
将此与Doug Currie的答案进行比较。语义是相同的,但取决于
(foo)
的返回类型,大多数常见的Lisp程序员会选择其中一种:

  • 如果
    (foo)
    返回布尔值,请使用
    (和…(foo))

  • 如果
    (foo)
    返回任意结果,请使用
    (when(and…(foo))


证明这一规则的一个例外是,程序员知道这两种习惯用法,但故意编写
(和…(foo))
。:-)

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

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

显然可以更简洁(例如道格的答案),但我认为这种方法对于人们来说更自然——尤其是如果代码的未来读者有C++或java背景的话!p> 真的很酷

(和x y)
是一个宏,您可以在clojure.org上查看,它扩展为
(如果x y为false)
,相当于:

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

(或xy)
类似但相反。

啊,短路很好,不是吗?谢谢道格。我不知道为什么我从来没有想到在Clojure网站上检查“和”。现在看起来很明显。你也可以在clojure中进行检查,例如
(doc和)
。请对Lisp代码使用标准缩进,不要在它们自己的行上加上右括号。我可以编辑吗?@Harleqin请随意修改。我正在学习clojure,我想知道已建立的代码格式习惯用法。好的。请注意,if语句的子部分是对齐的。这是通常的方式。对于某些构造(主要是当您有一个“主体”时),只需将缩进增加两个空格。我不知道Clojure是否有一个特定的风格指南,但是你可以试着从Common Lisp中推断出来请看“格式化Lisp代码”部分(接近末尾)。一个好的编辑器将帮助你格式化;事实上,当自动格式化不能满足您的期望时,您可以看到您犯了一些错误。@Harlequin--感谢您修复代码,并感谢指向格式化文档的指针。